登录到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。在JWT中使用jti是Auth0推荐的。jti唯一地标识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。
这是个虫子吗?请帮帮忙。
发布于 2016-12-15 12:00:16
默认情况下,不生成或包含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作用域;一个快速测试表明,在使用委托时,这也是有效的。
https://stackoverflow.com/questions/41147548
复制相似问题