Angular使用oidc-client.js时如何用现有令牌直接初始化userManager?
解决方案
oidc-client.js的UserManager不需要强制走重定向授权流程,你可以手动将后端接口返回的令牌组装为标准User实例后存入UserManager的存储介质,即可复用原有的身份状态管理能力,无需调用signinRedirect相关方法。
步骤1:调整UserManager配置
可以精简原有配置,保留必填的身份校验参数,去掉重定向相关的冗余配置:
const userManagerConfig = { resourceUrl: "//xxxxx.abc.net", clientId: "cdgdsg335", authority: "//xyz.com/A1", // 保留用于令牌颁发者校验,和令牌中的iss字段一致即可 scope: "openid email profile", automaticSilentRenew: true, // 如果需要自动用refresh_token续期可以开启 }
原配置中response_type、redirect_url等和重定向流程相关的参数可以直接删除。
步骤2:调用后端/token接口获取令牌
用Angular HttpClient调用后端接口,获取id_token、access_token、refresh_token、expires_in、token_type等返回参数。
步骤3:手动组装User实例并存入UserManager
oidc-client提供了User构造函数,可以直接用接口返回的令牌生成标准用户实例,再调用storeUser方法存入管理器,后续即可正常调用getUser()等方法获取身份状态:
import { UserManager, User } from 'oidc-client'; // 初始化UserManager const userManager = new UserManager(userManagerConfig); // 假设这是你调用/token接口拿到的返回结果 const tokenRes = { id_token: 'xxx', access_token: 'yyy', refresh_token: 'zzz', expires_in: 3600, token_type: 'Bearer', scope: 'openid email profile' } // 解析id_token中的用户信息,也可直接使用后端返回的用户信息 const profile = JSON.parse(atob(tokenRes.id_token.split('.')[1])); // 组装User实例 const user = new User({ id_token: tokenRes.id_token, access_token: tokenRes.access_token, refresh_token: tokenRes.refresh_token, expires_in: tokenRes.expires_in, token_type: tokenRes.token_type, scope: tokenRes.scope, profile: profile }); // 存入UserManager,完成身份配置 await userManager.storeUser(user); // 验证是否生效 const currentUser = await userManager.getUser(); console.log(currentUser.access_token); // 可正常获取到令牌
可选:refresh_token自动续期配置
如果开启了automaticSilentRenew,只需要保证配置中authority对应的OIDC服务的.well-known/openid-configuration端点可以正常访问,oidc-client会自动在令牌到期前用refresh_token请求新的令牌,无需额外开发。如果后端/token接口不符合标准OIDC刷新规范,你也可以手动监听UserManager的accessTokenExpiring事件,自己调用/token接口刷新令牌后重新调用storeUser更新即可。
内容的提问来源于stack exchange,提问作者AMMI REDDY KOVVURI
相关产品推荐
相关产品推荐

