reactjs - Microsoft Graph - React 客户端和 spring-boot 后端的 OAuth2.0 流程

标签 reactjs spring azure oauth-2.0 microsoft-graph-api

我正在构建一个基于 React 的 SPA,它通过 REST API 与 spring-boot 后端进行通信。我需要用户能够在浏览器客户端 (SPA) 上登录其 Microsoft 帐户,并且我需要后端服务(spring-boot 应用)能够代表该用户查询 Microsoft 的 Graph API。

在阅读了 Oauth2 流程后,授权代码流程(不是 PKCE 流程,只是常规授权代码流程)似乎是最合适的。浏览器客户端可以让用户登录他们的 Microsoft 帐户,检索授权代码,并通过 HTTP 请求将授权代码发送到我们的后端服务。然后,后端服务(受信任并且可以安全地存储客户端 key )可以请求访问 token ,直接向 Graph API 发出请求(这意味着 SPA 永远不需要向 Graph API 发出任何请求),然后静默刷新根据需要添加 token 。

但是,我看不到任何人使用此流程访问 Microsoft Graph API 的示例。

查看 Microsoft 的文档,他们似乎建议使用 on-behalf-of flow 。但此流程需要浏览器客户端请求访问 token ,然后使用该 token 与后端服务进行通信(后端服务又可以与 Graph API 进行通信)。对我来说,为什么不能使用客户端 key 在后端请求访问 token 是没有意义的。这难道不是比让客户端检索访问 token (如代表流程中所做的那样)更安全且更受欢迎的方法吗?

Oauth2.0 site ,建议 SPA 应使用 PKE 授权代码或隐式流程,但我没有看到使用 SPA 标准身份验证代码流程的选项。我是否应该将此视为 SPA 不应使用我之前描述的标准授权代码流程?

尽管在 Microsoft 的 React 前端 + java 后端文档中没有找到标准授权代码流程的清晰示例,但我尝试自己去做这件事。但是,使用 @microsoft/mgt-react@microsoft/mgt-element 库来执行此操作并不简单。例如,Provider@microsoft/mgt-element 概念支持检索访问 token 的调用,但不会明确公开授权代码。如果我想执行前面描述的授权代码流程,似乎我需要使用原始 HTTP 请求,我知道这不是完成此操作的推荐方法。

总结我的问题:

  • 我应该使用什么 OAuth2.0 流程:1) 授权代码(访问 token 由后端服务使用客户端 key 检索),2) 带有 PKE 的授权码(访问 token 由客户端检索),或者 3)代办流程(客户端获取access token,好像是PKE流程的扩展)?

  • 如果使用代表流,SPA 是否仅在 header 中包含访问 token (标记为“承载”),而后端服务仅包含 包含相同的 header 来查询 Graph API,或者后端 服务在查询 Graph API 之前需要请求另一个 token 吗?

最佳答案

同意@ch4mp,在允许的情况下直接在 SPA 中调用图 api。如果没有,那么我建议您根据您的要求使用代表流客户端凭据流

让我们回到您的需求——在 springboot api 项目中调用 ms graph api。首先,让我们看看其中一个图 api getting user api 。您可以在此处查看权限类型:委托(delegate)意味着代表用户调用图 api,应用程序意味着代表应用程序(您的 spingboot api 项目)本身调用 api。如果你想代表用户调用api,那么你必须使用代表流。这是因为 api 项目将被视为守护程序应用程序,因此项目本身没有 UI 页面来让用户输入用户名/密码来登录并进行身份验证。

你当然可以使用ROPC流程,它必须将用户名/密码传递给api,但我真的认为它不安全,所以我不推荐。

如果您不需要代表用户调用图形API,您当然可以考虑客户端凭证流。但请注意,应用程序类型 api 权限是一个“大型”api 权限,其名称始终如 User.ReadWrite.All、Mail.ReadWrite.All 并且始终意味着应用程序不仅可以查询用户信息的同时还能够修改用户信息。

如果您想使用代表流,那么您可以查看 this answer它解释了整个进展...

关于reactjs - Microsoft Graph - React 客户端和 spring-boot 后端的 OAuth2.0 流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74564878/

相关文章:

Java Spring boot hibernate删除级联数据

azure - 有没有办法以编程方式更改 cosmos db 表上的 TTL

reactjs - 如何使用 React Native 将 React-Native-Linear-Gradient 应用于整个应用程序背景

javascript - react 保持渲染 Prop 包裹组件的状态

javascript - 状态返回 undefined --React Native

spring - 前端 Controller 模式的 Servlet url 映射

java - Spring添加web.xml配置时Session总是过期

azure - 是否可以防止两个进程写入同一个缓存项?

c# - 以编程方式从 Azure Blob 存储连接字符串中提取属性

reactjs - React render props 是否会导致子组件的重新安装?