Hapi Auth OIDC (英语)
一个Hapi.js插件提供OpenID Connect(OIDC)认证,并有PKCE支持. 支持联邦的Cognitto活符,模拟活符测试,以及自动活符验证和刷新. 为服务器侧Hapi应用程序所设计.
特征
- 使用 PKCE 支持登录重定向到 OIDC 提供者
- Auth callback 处理令牌验证
- 以可配置的早期刷新窗口自动刷新访问令牌
- 联邦通过Cognitto身份池提供象征性支持
- 请求装饰确保ValidToken、登录和处理回调
- 用于开发和测试环境的模拟OIDC供应商
- 窗体 post and question auth 回调支持
- 完整的可配置饼干选项
安装
npm install @defra/hapi-auth-oidc
使用量
从图书馆导入
所有公共功能、提供者和插件都从库入口导出 :
import {
HapiAuthOidcPlugin,
CognitoTokenProvider,
MockProvider,
preLogin,
postLogin,
ensureValidToken
} from '@defra/hapi-auth-oidc'
或者,将整个库导入为命名空间 :
import * as OIDC from '@defra/hapi-auth-oidc'
const plugin = OIDC.HapiAuthOidcPlugin
const tokenProvider = new OIDC.CognitoTokenProvider({...})
注册插件
import Hapi from '@hapi/hapi'
import { AuthOidcPlugin } from './auth-oidc.js'
const server = Hapi.server({ port: 3000 })
await server.register(AuthOidcPlugin)
装饰请求
server.route({
method: 'GET',
path: '/protected',
handler: async (request, h) => {
const { token, refreshed } = await request.ensureValidToken(
request.auth.credentials
)
return { token }
}
})
托肯刷新
独立使用 :
import { ensureValidToken } from '@defra/hapi-auth-oidc'
const refreshedToken = await ensureValidToken(
{ accessToken, refreshToken },
getOidcConfig,
60000,
oidcScope,
logger
)
配置
插件选项
-
oidc- OIDC配置对象 :clientId- OIDC客户身份discoveryUri- OIDC 发现文件的 URLauthProvider- 托肯供应商(CognitoTokenProvider或者说MockProvider(中文(简体) )useHttp- 布尔旗允许不安全的 HTTP 请求发现( 默认: 虚假)loginCallbackUri- OIDC 登录后重定向 URIscope- 以空间分隔的一串瞄准镜externalBaseUrl- 用于构建绝对回调URL的基础URLdefaultPostLoginUri- 在登录后重新定向未另指明的URI(默认:'/'(中文(简体) )earlyRefreshMs- 令牌过期前毫秒提前刷新(默认:6000)
-
cookieOptions- 铁加密和安全的 Cookie 选项password- 用于铁加密的秘密(需要)isSecure- 只通过 HTTPS 发送 cookie( 默认: 真)encoding- 说吧'none' | 'base64' | 'base64json' | 'iron'(默认 :'iron'(中文(简体) )path- Cookie 路径( 默认 ):'/'(中文(简体) )isHttpOnly- 客户端JS无法访问 Cookie(默认:真实)isSameSite- 说吧'Strict' | 'Lax' | 'None'(默认 :'Lax'(中文(简体) )ttl- 以毫秒计的时间(可选)domain- Cookie域名( 可选)ignoreErrors- 忽略编码错误( 默认: 真)clearInvalid- 自动清除无效的 cookie( 默认: 真)
托肯供应商
认知托肯
- AWS Cognito身份池的联邦标志提供商.
- 自动缓存令牌并在到期前刷新.
- 支持通过可选的早期刷新
earlyRefreshMs。 。 。 .
提供模拟器
- 用于开发/测试的简单模拟符号提供者.
- 返回一个已编码的硬码 .
示例使用
import { config } from '../../../config/config.js'
import {
CognitoTokenProvider,
HapiAuthOidcPlugin,
MockProvider
} from '@defra/hapi-auth-oidc'
const authProvider = config.get('isProduction')
? new CognitoTokenProvider({
poolId: config.get('azureFederatedCredentials.identityPoolId'),
logins: { 'cdp-portal-frontend-aad-access': 'cdp-portal-frontend' }
})
: new MockProvider({})
const oidcCookieConfig = config.get('hapi-auth-oidc.cookie')
export const AuthOidcPlugin = {
plugin: HapiAuthOidcPlugin,
options: {
oidc: {
clientId: config.get('azureClientId'),
discoveryUri: config.get('oidcWellKnownConfigurationUrl'),
authProvider,
useHttp: config.get('isProduction'),
loginCallbackUri: config.get('appBaseUrl') + '/auth/callback',
scope: `api://${config.get('azureClientId')}/cdp.user openid profile email offline_access user.read`,
externalBaseUrl: config.get('appBaseUrl')
},
cookieOptions: {
isSecure: oidcCookieConfig.isSecure,
password: oidcCookieConfig.password
}
}
}