Авторизация пользователя с использованием библиотеки CASL, разделяющей серверную часть и интерфейсную часть

Я ищу способ реализовать авторизацию как во фронтенде (React), так и в бэкэнде (Node.js, Koa, GraphQL). Я наткнулся на пакет casl: https://github.com/stalniy/casl.

Хотя бэкэнд-авторизация кажется мне довольно простой, я не понимаю, как я могу передать свои правила авторизации из бэкэнда в свой интерфейс. В одном среднем посте предлагались токены JWT. Как это сделать с токеном JWT?

https://medium.com/dailyjs/casl-and-cancan-permissions-sharing-between-ui-and-api-5f1fa8b4bec


person Lucian Tarna    schedule 28.04.2020    source источник
comment
вы можете делиться правилами как хотите. В конце концов, это всего лишь массив объектов. Самый простой способ - вернуть их в теле ответа на запрос на вход.   -  person Sergii Stotskyi    schedule 29.04.2020


Ответы (1)


Кажется, что у CASL есть 2 функции для этого: packRules и unpackRules.

Согласно документации в бэкэнде, вы можете:

import { packRules } from '@casl/ability/extra';
import jwt from 'jsonwebtoken';
import { defineRulesFor } from '../services/appAbility';

app.post('/session', (req, res) => {
  const token = jwt.sign({
    id: req.user.id,
    rules: packRules(defineRulesFor(req.user))
  }, 'jwt secret', { expiresIn: '1d' });

  res.send({ token });
});

А в интерфейсе вы делаете:

import { unpackRules } from '@casl/ability/extra'
import jwt from 'jsonwebtoken';
import ability from '../services/appAbility';

export default class LoginComponent {
  login(params) {
    return http.post('/session')
      .then((response) => {
        const token = jwt.decode(response.token);
        ability.update(unpackRules(token.rules))
      });
  }
}

https://stalniy.github.io/casl/v4/en/api/casl-ability-extra

person Lucian Tarna    schedule 28.04.2020