0

angular-oauth2-oidc在 Angular 应用程序中使用 's Code Flow。一切正常,但是我无法阅读用户声明。

我尝试使用this.oAuthService.getIdToken(), this.oAuthService.getAccessToken()this.oauthService.getUserInfo()但我似乎没有得到任何可以使用常规方法解码的有效 JWT。

在我的后端 API (.NET Core) 中,我使用access_token来查询 TokenIntrospection 端点,我可以正确查看所有声明。

相关资料:

export const oAuthConfig: AuthConfig = {
  issuer: environment.oauth.issuer,
  // URL of the SPA to be redirected to after login
  redirectUri: environment.oauth.redirectUri,
  clientId: environment.oauth.clientId,
  dummyClientSecret: environment.oauth.clientSecret,
  responseType: 'code',
  scope: 'openid profile email',
  showDebugInformation: true,
  oidc: true,
  requireHttps: false,
};
async login() {
  await this.oAuthService.loadDiscoveryDocumentAndTryLogin();
  await this.oAuthService.initCodeFlow();

  this.router.navigate(['/']);
}

有什么建议么?谢谢您的帮助。

4

1 回答 1

1

有一个 getIdentityClaims 方法可以将 id_token 声明作为一个对象。首先,尽管您需要检查 HTTP 请求以验证 id_token 是否实际被返回,并且它包含您期望的声明。

向代币发行的索赔

在授权服务器中,您可以指定向何处发出声明,并且向两个令牌发出不同的声明是非常标准的:

  • 在您的情况下,ID 令牌供 UI 客户端使用,并且可能包含详细信息,例如用于显示的名称
  • 颁发访问令牌以供 API 客户端使用,并且可能包含用于授权的角色或用户 ID。

为了更好地理解这个概念,请参阅Curity Identity Server 使用的Claims Mapper概念。

我怀疑在您的情况下,系统未配置为(或不支持)向 id 令牌发出一些声明。

我的偏好

实际上,我认为您在访问令牌处理方面走在了正确的轨道上。UI 获取用户信息的另一种方法是将访问令牌发送到其 API,在/api/userinfo/current之类的路径上,然后 API 可以返回一个 JSON 对象,其中包含:

  • 来自访问令牌的声明
  • 任何其他可能对 UI 有用的领域特定数据

这种设计有以下好处:

  • 可扩展性:很容易将额外的数据添加到 API 有效负载中,这可能与 OAuth 无关
  • 隐私:通常不建议向 id_token 添加过多的用户数据,因为它可以在持续整个用户会话的可见 JWT 中使用
于 2021-03-04T21:07:58.180 回答