在 Auth0 中通过 refresh_token 更新 id_token 时,jti(JWT ID)不在新 id_token 中
When renewing id_token via refresh_token in Auth0, jti (JWT ID) not in new id_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 中使用 jti
。 jti
s 唯一标识 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
。
这是一个错误吗?请帮助。
默认情况下不生成或包含 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
范围;快速测试表明这在使用委托时也有效。
登录 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 中使用 jti
。 jti
s 唯一标识 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
。
这是一个错误吗?请帮助。
默认情况下不生成或包含 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
范围;快速测试表明这在使用委托时也有效。