首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当在id_token中通过refresh_token更新Auth0时,jti (JWT )不在新的id_token中

当在id_token中通过refresh_token更新Auth0时,jti (JWT )不在新的id_token中
EN

Stack Overflow用户
提问于 2016-12-14 16:30:07
回答 1查看 1.2K关注 0票数 0

登录到Auth0时:

代码语言:javascript
复制
POST https://my.auth0.com/oauth/ro
{
  "client_id":   "<client-id>",
  "username":    "me@gmail.com",
  "password":    "••••••••",
  "connection":  "<auth0-connection>",
  "grant_type":  "password",
  "scope":       "openid offline_access jti email",
  "device":      "<device-id>"
}
// Response
{
  "refresh_token": "<refresh-token>",
  "id_token": "<id-token>",
  "access_token": "<access-token>",
  "token_type": "bearer"
}
// id_token JWT payload
{
  "jti": "3d4c5e97-3543-4c53-b46e-3aa965cd5a34",
  "email": "me@gmail.com",
  "email_verified": false,
  "iss": "https://my.auth0.com/",
  "sub": "auth0|<id>",
  "aud": "<aud>",
  "exp": 1481766419,
  "iat": 1481730461
}

如果我在作用域中指定了jti,返回的id_token (即JWT )将包含一个jti。在JWT中使用jti是Auth0推荐的。jti唯一地标识JWT,并可用于黑名单JWT。

但是,出于某种原因,如果我尝试使用刷新令牌获得一个新的id_token

代码语言:javascript
复制
POST https://my.auth0.com/delegation
{
  "client_id":       "<client-id>",
  "grant_type":      "urn:ietf:params:oauth:grant-type:jwt-bearer",
  "refresh_token":   "<refresh-token>",
  "api_type":        "app",
  "scope":           "openid offline_access jti email",
  "device":          "<device-id>"
}
// Response
{
  "token_type": "Bearer",
  "expires_in": 35958,
  "id_token": "<id-token>"
}
// id_token JWT payload
{
  "email": "me@gmail.com",
  "email_verified": false,
  "iss": "https://my.auth0.com/",
  "sub": "auth0|<id>",
  "aud": "<aud>",
  "exp": 1481766678,
  "iat": 1481730720,
  "azp": "<azp>"
}

尽管我在作用域中指定了jti,但返回的id_token不包含jti

这是个虫子吗?请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-15 12:00:16

默认情况下,不生成或包含jti声明。如果您看到这种行为,最有可能的解释是您有一个自定义规则,它执行以下操作:

代码语言:javascript
复制
function (user, context, callback) {
  user.jti = require('uuid').v4();
  callback(null, user, context);
}

这意味着当您将jti作为作用域包含时,该值将包含在结果ID令牌中,因为它是从该属性获得的。在执行委托时,jti声明似乎得到了特殊待遇,并且在执行刷新时它被忽略了。但是,如果您希望继续使用该方法,并且只需要JWT中的唯一标识符,则不鼓励使用委托刷新,如果您使用的是非保留的声明名,则可能能够解决这一问题。例如,在一条规则中:

代码语言:javascript
复制
function (user, context, callback) {
  user.myjti = require('uuid').v4();
  callback(null, user, context);
}

然后,对这两个请求都包括myjti作用域;一个快速测试表明,在使用委托时,这也是有效的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41147548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档