简体中文
  • oidc
  • oauth
  • api资源
  • jwt
  • 访问令牌
  • Opaque令牌

连接各点:深入探索OIDC资源和你的JWT访问令牌

这篇博客旨在阐明OIDC资源指标与获取访问令牌之间的关系。

Charles
Charles
Developer

背景

之前的一次会话中,我们对开放ID连接(OIDC)协议、刷新令牌、访问令牌和ID令牌进行了介绍,这些都是在应用程序中构建强大认证的重要组成部分。然而,我们的社区中仍然有很多疑问,一个反复出现的询问是:"为什么我的访问令牌不是JWT?”

对于那些刚接触这些概念的人,或者是那些需要复习的人,这篇博客帖子旨在阐明OIDC资源指标与获取访问令牌之间的关系。

了解OIDC资源

如果你熟悉OAuth 2.0协议,你应该对"[resource](https://www.rfc-editor.org/rfc/rfc8707.html)"这个词不陌生。由于OIDC构建在OAuth 2.0之上,它继承了这个概念。

一个"资源"或"受保护资源"是客户端应用程序希望代表认证用户访问的实体的一种表示。这可以是用户信息、服务器API,或者服务器授权的任何其他数据。

根据协议,资源是向授权服务器请求的参数。它是一个绝对URI的值,例如 https://my-company.com/api。它充当资源的标识符,可能对应于网络可访问的位置,甚至是唯一的但出于虚构的URI。

在Logto中,你可以通过“Admin Console → API resources”页面创建一个“API资源”。你可以参考这个文档获取更多的细节。

JWT访问令牌

只有在访问令牌请求期间指定"资源"参数时,JWT(JSON网络令牌)格式的访问令牌才会被发出,它带有一组声明,你可以解密并验证这些声明,例如,确保令牌的完整性和用户的权限。

然后,这个"资源"就成为JWT中的 aud 令牌声明之一,指示令牌的预期受众。参见RFC-7519

因此,关系变得清晰了:

  • 在请求JWT令牌时指定资源指示符。
  • 资源指示符与 aud 令牌声明一致。
  • 当发出API请求时,必须将JWT访问令牌作为持有者令牌头部包含进来。你的API服务器应解密并验证 aud 声明和其他与权限相关的声明,以确保API请求的安全。
  • 每个访问令牌对应一个单一的资源。如果你有多个API资源已注册并带有不同的URI,请为每个资源请求不同的访问令牌。

🤔 但是,如果客户端在请求访问令牌时没有指定资源会怎样呢?

Opaque访问令牌

在Logto的情况下,如果在请求访问令牌时没有指定资源指示符,授权服务器会假定它是用于OIDC/userinfo端点的,因此会发出一个Opaque访问令牌,随后客户端可以使用它来请求OIDC userinfo端点的用户个人资料,例如用户ID、姓名、电子邮件等。

在任何Logto SDK中,如果你调用getAccessToken()或直接请求OIDC令牌端点而不指定resource参数,你都可以获得这样的令牌。

请注意,这个Opaque访问令牌不适用于你自己的API资源请求,因为没有办法在不请求OIDC服务器的情况下进行验证。

总结

OIDC资源定义了客户端应用程序希望代表用户访问的特定数据或服务,JWT访问令牌作为这种访问的安全手段。JWT访问令牌中的"aud"声明与资源指示符对齐,帮助服务器在客户端请求时验证权限。

在Logto中,Opaque访问令牌仅用于从OIDC userinfo端点获取用户个人资料信息,而客户端可以请求多个访问令牌,每个令牌都专门用于一个特定的资源。

我们希望这篇博客文章能消除你的任何疑惑,为你连通所有的点。欢迎随时告诉我们你的想法。