✅已解决 | 使用Guard如何获得Access Token?

我发现使用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

  1. 之后按照 接口文档 进行请求即可,接口文档地址:

https://www.apifox.cn/web/project/548164/apis/api-41076699

所以我应该使用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 中内置一个方法,你直接调用即可。

Guard v5.1.9 已支持 getAccessTokenByIdToken,具体使用方法如下:

  • 『控制台 → 应用 → 自建应用 → 协议配置 → 授权配置』勾选如下选项:

可以先参考 GitHub 上的示例代码哈,文档后续会补充。