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

如何使用ADAL JS发布的隐式授权令牌从Web API访问Graph API

楮自珍
2023-03-14

我有一个内置Java的Web API,它可以将数据库信息返回给SPA。在发送响应之前,我需要使用AAD Graph API检查用户的组信息。现在,Web API接受请求并读取用户的令牌(eyJ…)。

应用程序准备好代表用户向Graph API发送请求的下一步是什么?

我已经尝试使用用户的令牌发送带有授权:承载ey...标头的请求,但收到Authentication_MissingOrMalformed错误。我还尝试了对应用程序清单和委托权限的各种编辑,但没有成功。

共有1个答案

欧阳杰
2023-03-14

API收到的访问令牌仅用于API。您需要的是代表当前用户为Azure AD Graph API获取一个新的访问令牌。

幸运的是,这正是代表流的目的。来自Azure AD的身份验证方案:

代表规范草案使用OAuth 2.0的委派用户标识

下面讨论的流程假设用户已经在另一个应用程序(例如本机应用程序)上进行了身份验证,并且他们的用户身份已经用于获取第一层web API的访问令牌。

  1. 本机应用程序将访问令牌发送到第一层web API
  2. 第一层web API向Azure AD的令牌endpoint发送请求,提供其客户端ID和凭据,以及用户的访问令牌。此外,发送请求时会附带一个代表参数,该参数指示web API正在请求新令牌以代表原始用户调用下游web API
  3. Azure AD验证第一层web API是否具有访问第二层web API的权限,并验证请求,将JWT访问令牌和JWT刷新令牌返回给第一层web API
  4. 通过HTTPS,第一层web API然后通过在请求的授权标头中附加令牌字符串来调用第二层web API。只要访问令牌和刷新令牌有效,第一层web API就可以继续调用第二层web API

请确保配置API以请求Azure AD Graph API的正确权限集。

编辑:如果您自己构建令牌请求,您的API将向Azure AD发出的代表当前用户向Graph API获取新令牌的请求将是针对以下内容的POST:

https://login.microsoftonline.com/{tenant-id}/oauth2/token

正文中包含以下参数(未编码,为了易读性,实际上这些是应用程序/x-www-form-urlencoded,当然):

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&
requested_token_use=on_behalf_of&
assertion={access-token}&
client_id={api-client-id}&
client_secret={api-client-secret}&
resource=https://graph.windows.net&
scope=openid

其中{tenant-id}是目录标识符(域名或Guid值),{access-Toker}是您的SPA提供给您的API的访问令牌(您正在交换对Graph API的访问令牌),{api-client-id}是您的API的客户端ID,{api-client-Secret}是API的秘密密码凭据。

(注意,为简单起见,本示例使用密码凭据(client\u secret)来验证API,但很可能使用由客户端证书签名的断言。)

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

  • 我使用隐式授权流将Spotify API与AngularJS结合使用,但我不能使用access_token。 我以这种方式实现了隐性拨款流: 当我上网址时,我被很好地重定向到Spotify认证,但当我连接时,浏览器进入重定向循环:Spotify将我重定向到localhost/~mathieu这将我重定向到Spotify等… 我想在Spotify重定向我之后,我的脚本无法获取令牌,所以我再次被重定向

  • 我已经阅读了许多帖子,所有我能找到的Google文档,并尝试了以下的许多迭代,但仍然无法获得访问和刷新令牌。我确实获得了授权代码,但似乎无法获得该代码来交易访问和刷新令牌。 这样,我就可以在我的属性中剪切并粘贴一个访问代码(只是测试并尝试让它先工作)来获得刷新和访问令牌。 在initRefreshToken()方法中,源代码如下: 如果这是第二次或以后使用该代码,将打印以下内容: 推荐令牌: **

  • 如何确定Authorization: Bearer中使用的JWT令牌...是访问令牌或刷新令牌。换句话说,是什么阻止用户在授权头中使用他的JWT刷新令牌而不是访问令牌。 当我在本指南https://github . com/starkandwayne/ultimate-guide-to-uaa/blob/master/docs/refresh-tokens . MD # jwt-refresh-t

  • 我遇到了使用文档签名 API 的第一个障碍,需要一些帮助。 我将docusignrestapi集合导入到Postman中。我设置了iKey、iSec、encodedKeys和codeFromUrl变量。 当尝试发送'01-授权代码授予访问令牌'post API时,我每次都得到以下响应。 我尝试从Postman中删除所有内容,包括环境,并从DocuSign中删除该应用程序,然后重新开始,以便我的所有

  • 我想避开keycloak登录页面。我将这个“避免keycloak默认登录页面和使用项目登录页面”链接引用到“http://localhost:5555/auth/realms/master/protocol/openid-connect/token”链接,并能够使用post方法获得访问令牌。 在此步骤中获得访问令牌后,提到要传递以下头部 标题:{ 但是不清楚将访问令牌传递到哪里,响应是什么,请求类