我正在尝试遵循 OpenID Connect best practices。对于从应用程序调用API的简单方案, OpenID Connect 建议传递访问令牌(不包括用户身份),如果API在某些方面需要用户身份,则应调用{{ 1}} OpenID Connect 提供程序的端点。
所以问题是:这是在API中获得用户身份的最佳方法吗?
假设我有一个名为/userinfo
的端点,那么每次任何用户调用此api时我都需要调用CreateOrderForCurrentUser()
端点,调用api似乎花费太多。
任何想法。
这似乎与我的问题相同:Clarification on id_token vs access_token
他在评论中回复:https://community.auth0.com/t/clarification-on-token-usage/8447#post_2
据我的理解,这是:在Access令牌(自定义声明)中放入一些身份声明,并依赖于API中的身份声明。
但仍然没有意义。 OIDC坚持不使用访问令牌作为身份,现在我们将在访问令牌中添加身份声明。有人可以澄清吗?
答案 0 :(得分:0)
ID_Token用于您的客户端应用程序,告诉应用程序您是谁,ID令牌的受众是您的客户端应用程序的ID,具有访问令牌,API /资源知道是否有权访问API并执行指定的特定操作
默认情况下,它将在访问令牌(子声明)中包含用户标识符,因此在调用CreateOrderForCurrentUser
函数时应该知道哪个用户。如果需要,您可以自定义访问令牌以包括更多与用户相关的声明。但是我建议简化访问令牌,您可以通过调用用户的API端点使用访问令牌来获取用户信息。
答案 1 :(得分:0)
我在Auth0 Community中问了相同的问题,对此进行了讨论,这可能会对其他有相同问题的人有所帮助。
我在这里复制相同的答案:
您是正确的,不应使用访问令牌作为身份证明,但是在使用API之前,您应该已经对用户进行了身份验证并收到了id_token。 如果您已经通过OIDC对用户进行了身份验证,据我所知,向访问令牌添加自定义声明以将数据传递到您的API没什么问题。您的API也可以使用客户端凭据授予类型从Auth0中提取数据。
我:
我正在寻找最佳做法。我想确保在访问令牌中添加身份声明并依赖于API中的身份声明不会破坏任何东西,并且基于最佳做法,或者也许最佳做法是始终称为{{ 1}} API中的终结点,并且不依赖于访问令牌身份声明。
API不知道身份验证过程,因此也不在乎。任何将签名的访问令牌传递给API的人都将被接受。现在从API的角度来看,依靠Access Token中的身份声明的正确方法是吗?我有疑问但是,如果我们每次都忽略调用/userinfo
端点,我会很高兴。
我可以(希望)分享一些有关此主题的见解,但是请您以一点点的观点和观点接受您不同意或您认为不够清晰的问题。当软件附带软件时,魔鬼就在细节上,而在安全方面更是如此,因此您需要考虑最佳实践,因为在大多数情况下可能会建议采用哪种最佳做法,而风险也较小。这并不意味着没有其他可能。
例如,尽管建议的确确实是在对API的请求中使用访问令牌,但这并不意味着就技术而言也可以发送ID令牌。
关注您的特定问题,并从最后一个(3)开始;我们不应该比较HOK和访问令牌,因为它们不在同一级别。换句话说,您可能会质疑在这种情况下是否应该以这种方式使用承载令牌或HOK令牌,并使用链接页面的术语在两个令牌配置文件中进行选择,每个令牌配置文件都具有不同的特征。
目前,由Auth0服务发出的访问令牌是API授权的一部分,是承载访问令牌,因此,如果使用Auth0服务,则此问题只有一个答案。
跳到第一个问题;这并不是说您不能将ID令牌传递给API,而仅仅是限制了足够的方案。例如,以客户标识符作为访问者的ID令牌发出;通常有多个客户端应用程序,因此您刚刚将API与拥有的客户端应用程序耦合在一起,因为假设您将验证ID令牌的受众,那么您的API现在需要知道每个客户端的标识符。
对于我认为的问题(2),如果可以在访问令牌中包含声明,为什么还要调用/ userinfo。我认为这在很大程度上取决于要求和/或个人喜好。目前,向自定义API颁发访问令牌时唯一支持的格式是JWT格式。
上面的意思是您拥有一个自包含的令牌,该令牌一旦发布,就可以独立进行验证,这在可伸缩性方面非常重要,因为API不需要进行(频繁)外部调用来进行验证。
但是,这是自包含的,这立即意味着您直接包含在令牌中的任何数据将被视为令牌本身生命周期内的真相。相反,如果该API直接调用/ userinfo或什至是Management API,那么您将以确保网络开销为代价来确保新数据。
最后,从我个人的观点来看,从最佳实践的角度来看,网络通话和嵌入式声明之间的选择与您感兴趣的数据的特征更为紧密。 >
最后一点,即使没有添加任何自定义声明,由服务发出的与自定义API关联的访问令牌也已经传达了用户身份。特别是,假设访问令牌是JWT,则子权利要求将包含一个标识符,该标识符唯一地标识授权当前应用程序代表其调用API的最终用户。