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

时间:2016-12-14 16:30:07

标签: auth0 refresh-token

登录Auth0时:

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。 Auth0建议在JWT中使用jtijti唯一标识JWT,可用于将JWT列入黑名单。

出于某种原因,如果我尝试使用刷新令牌获取新的id_token

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

这是一个错误吗?请帮忙。

1 个答案:

答案 0 :(得分:1)

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

function (user, context, callback) {
  user.jti = require('uuid').v4();
  callback(null, user, context);
}

这意味着当您将jti作为范围包含在内,该值将包含在生成的ID令牌中,因为它是从该属性获取的。在进行授权时,jti声明似乎会得到特殊处理,并且在您进行刷新时会被忽略。不鼓励使用委托进行刷新,但是,如果要继续使用该方法并且只需要JWT中的唯一标识符,如果使用非保留声明名称,则可以解决此问题。例如,在规则中:

function (user, context, callback) {
  user.myjti = require('uuid').v4();
  callback(null, user, context);
}

然后在两个请求中都包含myjti范围;快速测试表明,这在使用委托时也有效。