当前位置: 首页 > 知识库问答 >
问题:

使用OAuth 2.0/OpenID连接访问与ID令牌进行REST-API授权的最佳实践

缑赤岩
2023-03-14

在过去的几周里,我读了很多关于OAuth2.0/OpenID的文章,但是有些事情仍然不清楚。我理解这些协议的目的:虽然OpenID发出一个ID令牌,通常是JWT,它告诉我用户是谁,但OAuth 2.0发出一个访问令牌,但这并没有告诉用户的身份。我还了解到id令牌的用途是在客户端软件中使用它,例如显示用户的姓名或甚至其个人资料图片。

我还阅读了强烈的建议,当我实现自己的REST-API时,访问令牌应该是作为HTTP头授权的请求,而不是id令牌。

嗯,我需要调用的API也需要知道用户的身份。例如,如果用户调用创建新记录的POST操作,我也喜欢存储调用API的用户的电子邮件地址。

API需要知道标识的另一个原因是我们当前的设置:我们使用Azure Active Directory,在那里我们将组分配给用户。当我们需要检查API调用的授权时,我们会检查用户是否被分配到某个组。如果将分配的组作为访问令牌的声明提供,这将非常好,但不幸的是,这是Azure AD B2C缺少的功能。此功能请求已存在。但是,除非这是可用的,否则我们需要调用MicrosoftGraphAPI来检索指定的用户组。在调用Graph API时,我们还需要知道调用API的用户的身份。

那么,对于API授权,特别是通过Azure AD/Azure ADB2C管理用户和访问权限时,您有什么建议?

共有2个答案

窦哲彦
2023-03-14

还值得注意的是,您可以对访问令牌保密,并在API中使用声明缓存设计来管理首次收到新访问令牌时查找图形用户信息。

这是一个可移植且易于扩展的解决方案,可用于任何授权服务器。我的一些资源可能会给你一些想法:

  • Azure代码示例博客帖子
祁嘉木
2023-03-14

Azure ADB2C不提供在发布令牌时添加自定义声明或更具体地说(在您的情况下)用户组信息的功能。至少不是开箱即用。

但我认为,通过使用定制策略并结合相应的技术概要文件,可以实现您所需要的。

基本上,它允许您通过应用自定义行为来更改标准广告B2C用户流的行为。因此,可以让Azure AD B2C通过技术配置文件请求用户组信息,以便在B2C用户流(例如登录)期间接收自定义声明,这些声明可以包含在已发布的令牌(id令牌或访问令牌)中。

由于您需要Azure AD提供的信息,我认为您可以将Azure Active Directory技术配置文件用于您的解决方案。

有关更详细的解释和设置自定义策略的教程,请参阅此处:https://mrochon.azurewebsites.net/2019/05/06/using-groups-in-azure-ad-b2c/

但在您开始使用自定义策略之前,我建议确保Azure AD B2C提供的内置声明(属性)(可通过B2C的配置功能包含在已发行的现成代币中)不包含您需要的声明类型。看见https://docs.microsoft.com/en-us/azure/active-directory-b2c/user-profile-attributes

例如,您提到的用户的电子邮件地址已经作为内置属性提供。

 类似资料:
  • 我试图使用以下所需信息从API生成访问令牌: 授权endpoint:https://api.paylocity.com/identityserver/connect/token 其他值请求必须在请求正文中发布以下表单编码值: grant_type=client_credentials范围=WebLinkAPI 我尝试使用Python'requests'包,但没有成功,请参见下面: 我已经验证了我的

  • 我想要一些关于如何在隐式授予流中使用ID令牌和访问令牌的澄清。我有一个使用msal.js for Angular包的Angular SPA和一个Web API。API不调用任何外部服务,如MSFT Graph。后端仅使用JWT中的角色声明来建立对API功能的RBAC授权。 这个文档写着:https://docs.microsoft.com/en-us/azure/active-directory/

  • 我正在学习本教程,以便在我的express API中启用jwt身份验证。https://jonathanmh.com/express-passport-json-web-token-jwt-authentication-beginners/ 一个简单的passport.authenticate调用app.get(“/callback”,passport.authenticate(“jwt”,{se

  • 在REST spring Boot中对用户进行授权和身份验证的最佳实践是什么? 我正在构建一个带有标准页面+REST API的移动应用程序。我看了很多关于Spring Security性的文章,基本上大多数都采用了某种fitler方法,允许或阻止REST调用。然而,在我的例子中,我有一些基于用户是谁的身份验证逻辑。例如,有一个API可以更新用户信息,用户可以更新自己,但不能更新其他人。最初我想使用

  • 我有一个ADFS 4.0 OpenId连接设置,应用程序组为“Web浏览器访问Web应用程序”。我使用隐式流,能够从我的web应用程序成功登录,接收id_令牌并访问_令牌。 接下来,我在从wep应用程序发送到应用编程接口服务器的请求中使用访问令牌。我想做的是自定义访问令牌格式——添加额外的参数,因为默认情况下我只有: aud、iss、iat、exp、apptype、appid、Authmethod

  • 我正在尝试与URL(python客户端)建立websocket连接,该URL需要传入jwt令牌,服务器(在GO中实现)在上侦听该请求,并应该通过解析令牌进行身份验证。 我试着用这部分代码来提出请求- 此请求命中运行此代码以验证此请求的服务器 func ParseFromRequest(req*http.Request,keyFunc-keyFunc)(令牌*令牌,错误){ } 每次,我都会得到“E