解码令牌不会提供用户个人资料

Posted

技术标签:

【中文标题】解码令牌不会提供用户个人资料【英文标题】:Decoding the token doesn't give user profile 【发布时间】:2017-06-08 09:10:49 【问题描述】:

我已经尝试解决这个问题好几天了。 我按照 Auth0 文档中的教程进行操作。

使用 express-jwt 解码令牌后:

export let headerJWTCheck = expressJwt(
    secret: '*************************',
    audience: '******************************'
);

req.user 的内容没有我在 API 中进行角色限制所需的配置文件和角色。

内容的形式是:

 iss: 'https://******.eu.auth0.com/',
  sub: 'google-oauth2|***********************',
  aud: '********************',
  exp: **************,
  iat: **************

在前端我已经获得了我需要的用户个人资料信息,但我无法继续前进。

我正在使用一个函数来限制角色:

export function requireRole(role: string) 
return function (req, res, next) 
    console.log(req.user);
    var appMetadata = req.user.profile._json.app_metadata || ;
    var roles = appMetadata.roles || [];

    if (roles.indexOf(role) != -1) 
        next();
     else 
        res.redirect('/unauthorized');
    

但 req.user.profile 始终未定义。

在我的主要快速应用程序定义中:

app.use(cookieParser());
app.use(session(
    .................
));
configurePassport();

app.use(passport.initialize());
app.use(passport.session());

【问题讨论】:

【参考方案1】:

解决方案是在 auth0-lock 配置中添加以下代码:

auth: 
    params: 
        scope: 'openid app_metadata roles'
    

解码令牌后将app_metadata和角色数组添加到req.user

【讨论】:

【参考方案2】:

express-jwt 库正在根据请求中包含的令牌内容初始化 req.user

如果您需要req.user 级别的信息,您需要include that information directly on the token 或在运行角色检查之前对req.user 进行扩充。例如,您可以通过运行附加代码来丰富 req.user,该代码根据 sub 声明(用户标识符)获取角色。

【讨论】:

以上是关于解码令牌不会提供用户个人资料的主要内容,如果未能解决你的问题,请参考以下文章

避免 Azure AD 颁发的 JWT 令牌中的个人信息

如何跨多个微服务提供用户身份?

如何使用 Oauth2.0 解码不透明的访问令牌

twitter 获取用户个人资料数据

用于用户身份验证的个人访问令牌和 json Web 令牌有啥区别?

如何解码我在 Swift 中收到 REST API 的 JWT 令牌?