假设我有一个本机应用程序需要发出请求的Web API。此API需要通过本机应用程序验证用户是谁在发出这些请求。 OpenID Connect似乎是正确的选择,因为它是关于身份验证而不是OAuth授权。
本机应用程序将用户凭据发送给IDP并获取访问令牌(用于授权)和id令牌(用于身份验证)。根据我对OIDC的理解,访问令牌将被发送到API,但id令牌仅用于本机客户端应用程序。这对我没有意义,因为它关注的是用户是谁,而不是本机应用程序。
那么为什么id标记也没有传递给受保护资源(又称API)?如果您没有将id令牌传递给API,那么什么可以保证访问令牌是安全的并且可以用来验证用户?否则,它似乎失去了使用OIDC而不是OAuth的好处。
答案 0 :(得分:8)
OIDC规范的设计方式是ID令牌始终用于客户端(Native app),而Access令牌用于资源(API)。 ID令牌始终是JWT令牌,但Access令牌可以是不同类型。
Access令牌的目的不是验证,而是授权(委托授权)。如果由于某种原因,资源服务器想要了解用户,则可以调用user-info端点。
可以通过多种方式验证令牌交换的安全性/有效性:
使用公钥/私钥模型的加密/签名,其中授权服务器使用其私钥加密/签署访问令牌,资源服务器使用公钥解密/验证。
使用令牌内省端点来验证声明,令牌的有效性等。
其他属性(如AUD,AZP)有助于验证已颁发的访问令牌。
一些OIDC提供商使用ID_Tokens来访问API - 这与OIDC规范建议的模型不同
此article详细说明了这些情况。