Есть ли способ интегрировать Auth0 в Loopback 4? - PullRequest
0 голосов
/ 16 июня 2019

Я работаю в проекте с Loopback версии 4, фреймворком Node.js.Мне нужно реализовать аутентификацию с Auth0.Однако кажется, что Auth0 не совместим с версией 4 Loopback.Я не мог найти документацию или даже учебник по этому вопросу.Кто-нибудь там когда-либо реализовывал аутентификацию с помощью Auth0 в Loopback 4?

1 Ответ

2 голосов
/ 17 июня 2019

Привет от команды LoopBack ?

Аутентификация и авторизация - это функции, над которыми мы сейчас активно работаем (по состоянию на июнь 2019 года).Насколько я могу судить из документов Auth0 (см. Сервер-клиент + API: Реализация Node.js для API ), они используют токены JWT.

К счастью, у нас уже есть примерприложение, демонстрирующее аутентификацию на основе JWT - см. https://github.com/strongloop/loopback4-example-shopping

Взгляните на класс JWTService , это место, где клиентские токены анализируются и проверяются.

В примере Express, предоставленном Auth0, используется пакет express-jwt , который оборачивает jsonwebtoken в промежуточное программное обеспечение Express.

В LoopBack мы вызываем jsonwebtoken напрямую.

Для адаптации примера на основе Express, предоставленного Auth0, должно быть достаточно выяснить, как передать соответствующие биты конфигурации express-jwt в библиотеку jsonwebtoken.

Вот конфигурация, скопированная из документов Auth0:

// Create middleware for checking the JWT
const checkJwt = jwt({
  // Dynamically provide a signing key based on the kid in the header and the singing keys provided by the JWKS endpoint.
  secret: jwksRsa.expressJwtSecret({
    cache: true,
    rateLimit: true,
    jwksRequestsPerMinute: 5,
    jwksUri: `https://YOUR_DOMAIN/.well-known/jwks.json`
  }),

  // Validate the audience and the issuer.
  audience: process.env.AUTH0_AUDIENCE,
  issuer: `https://YOUR_DOMAIN/`,
  algorithms: ['RS256']
});

Вот как LoopBack JWTService вызывает библиотеку jsonwebtoken:

https://github.com/strongloop/loopback4-example-shopping/blob/5f36ae289f50d67bcdc33637c0323daa1f10e02b/packages/shopping/src/services/jwt-service.ts#L35

const decryptedToken = await verifyAsync(token, this.jwtSecret);

Обратите внимание, что jwtSecret вводится в службумынастраиваем его здесь:

https://github.com/strongloop/loopback4-example-shopping/blob/2d8978d0d72150caf95573c362402491a92757e7/packages/shopping/src/application.ts#L76-L78

    this.bind(TokenServiceBindings.TOKEN_SECRET).to(
      TokenServiceConstants.TOKEN_SECRET_VALUE,
    );

Я считаю, что вам нужно заменить TokenServiceConstants.TOKEN_SECRET_VALUE значением, возвращаемым jwksRsa.

this.bind(TokenServiceBindings.TOKEN_SECRET).to(
  jwksRsa.expressJwtSecret({
    cache: true,
    rateLimit: true,
    jwksRequestsPerMinute: 5,
    jwksUri: `https://YOUR_DOMAIN/.well-known/jwks.json`
  }),
})

Остальные вещи, которые нужно выяснить:

  • Как применять опции audience, issuer и algorithms.

  • Я не уверенесли jsonwebtoken поддерживает динамические секреты из коробки.Если приведенное выше предложение не работает, то вам, возможно, придется поискать в express-jwt источниках, чтобы узнать, как они обрабатывают динамические секреты.

Я надеюсь, что в моем ответе будет достаточно указателей, которыеПозвольте себе выяснить недостающие детали самостоятельно.Было бы здорово, если бы вы могли опубликовать полностью рабочее решение, если вам удастся его разработать.

...