Привет от команды 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
источниках, чтобы узнать, как они обрабатывают динамические секреты.
Я надеюсь, что в моем ответе будет достаточно указателей, которыеПозвольте себе выяснить недостающие детали самостоятельно.Было бы здорово, если бы вы могли опубликовать полностью рабочее решение, если вам удастся его разработать.