我发现使用Guard登录只能得到ID Token, 包括返回的authClient也只有ID Token, 请问有没有办法获得Access Token? 还是说有ID Token的情况下没必要获得Access Token?
有 ID Token 可以标识用户身份,如需查询用户权限,可以结合 SDK 使用
https://docs.authing.cn/v2/guides/access-control/
https://docs.authing.cn/v2/reference/sdk-for-node/management/AclManagementClient.html
同样的问题,使用Guard怎么获取Access Token
前端直传ID token到后端显然是不可取的
使用 Authing User ID Token 换取 Access Token 的方法:
1、使用 ID Token 换取 Access Token,需要调用 /oidc/token ,接口文档地址:
https://www.apifox.cn/web/project/548164/apis/api-41076699
2、调用 loginByPhone 等接口获取用户信息后,获取到用户属性中的 token 字段,以此换取 access token 和 OIDC id token(增加 scope ‘openid’)
user: {
name: '123',
...
token:'idToken'
}
3、authing token 换取 accessToken 需要在 authing 控制台选择:
a. 授权模式 authing_token
b. 返回类型 code token
4、如果换取时不希望填写 client_secret,验证方式选择 none
- 之后按照 接口文档 进行请求即可,接口文档地址:
所以我应该使用Guard内置的JS SDK手动调用这个API,通过ID Token换取Access Token对吧?
你这边提到的接口文档好像和你们官网提供的API文档内容不大一致,以哪个为准呢?
https://api-explorer.authing.cn/?tag=tag/管理%20Token/API%20列表/operation/OidcV2TokenController_exchangeToken
还有我这边guard的版本是 @authing/vue-ui-components 2.4.61,内置的JS SDK是否支持这个API呢?
内置 JS Authentication SDK 中有 getAccessTokenByCode 这个方法,使用 code 换 token:
class Authentication {
async getAccessTokenByCode(
code: string,
options?: { codeVerifier?: string }
) {}
}
示例代码如下:
const authing = new AuthenticationClient({
appId: 'AUTHING_APP_ID',
appHost: 'https://example.authing.cn',
redirectUri: 'https://baidu.com',
tokenEndPointAuthMethod: 'none',
protocol: 'oidc'
});
let res = await authing.getAccessTokenByCode(
'xoLxw18uPidrwNHWMFC8AwlBl5aciCP8Em_-NcvURZ-',
{
codeVerifier: 'Bu6RP796BBiAwGwdUpHpKfhmQqahszBcGep8qT31XOy'
}
);
看下 Guard 2.x 中集成的 SDK 中是否有这个方法,并且你的业务逻辑是否用到了 code。如果是在 Guard 中监听登录成功的事件,然后获取到的用户信息中有 id token,想进一步获取 access token 的话,建议使用上面的 API。
getAccessTokenByCode时报错
{“error”:“invalid_grant”,“error_description”:“授权码无效或已过期”}
换取 token 身份验证方式我选择的是None
稍等哈,我在 SDK 中内置一个方法,你直接调用即可。