【问题标题】:Oauth2 flow for native app with back-end web app calling Graph API原生应用程序的 Oauth2 流,后端 Web 应用程序调用 Graph API
【发布时间】:2018-04-15 01:27:50
【问题描述】:

我有以下设置:

  • 网络应用(Jetty/Java)
  • 本机客户端 (iOS)(调用我的 webapp)
  • Microsoft Graph API(从我的网络应用调用)

这个想法是用户应该使用他/她的 Office 365 凭据通过 OpenID/Oauth2 登录。然后,Web 应用将代表用户调用 Microsoft Graph API(也可以离线)。

为了实现这一点,我很确定我需要使用授权类型:“授权码授权”。 我可以找到很多基于浏览器的应用程序的 Oauth2 流程示例,以及当本机应用程序直接调用 Graph API 时...... 但我希望我的后端调用 Graph API(并保持访问和刷新令牌).

所以问题是如何正确地做到这一点?这是我目前的想法。

  1. 从本机应用程序:打开浏览器,调用我的 Web 服务器,这将触发重定向到 Azure /authorize 端点(例如:https://login.microsoftonline.com/[tenant]/oauth2/v2.0/authorize?client_id=[clientid]&response_type=code&scope=offline_access%20user.read%20calendars.readwrite&response_mode=query&state=12345&redirect_uri=my-scheme://oath2-code-reply

  2. 这将触发身份验证/授权,然后将访问代码发送回应用程序(使用自定义方案重定向:my-scheme://oath2-code-reply)。

  3. 然后应用程序可以使用此访问代码调用我的网络应用程序,我们可以在其中交换代码以获取刷新和访问代码,还可以为用户创建我们自己的会话。

这是正确的方法吗?

或者整个流程应该发生在浏览器中,作为最后一步,我再次使用 myapp-scheme://?sessionid=[our-own-session] 之类的内容打开应用程序?

【问题讨论】:

    标签: oauth-2.0 azure-active-directory adal


    【解决方案1】:

    对于您的场景,您应该使用on-behalf-of-flow

    您可以用作参考的服务器端示例是 https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof - 请注意,此示例是使用 JavaScript SPA 作为客户端的 .NET 示例 - 但希望它可以指导您。您可以使用this sample 了解如何为您的 Web api 请求令牌。

    请注意,您的商品为“1”。建议您使用“v2”端点。 “v2”端点有一些限制,包括您尝试完成的场景(请求访问 Web API 的令牌) - 请参阅 this document 了解这些限制的信息,因此我的建议是使用 v1端点此时适用于您的场景 - 这意味着您只能验证公司帐户(而不是 MSA)。我上面指出的文档和示例使用 v1 端点。

    【讨论】:

    • 谢谢安德烈,我会查看这些链接!
    • 一个后续问题:我没有提到我们也有一个基于浏览器的客户端,它有一个更直接的方法(我们在我们的 Java 后端保存用户访问和刷新令牌) .是否有任何理由我们不能将本机客户端视为浏览器并实现类似于我在原始问题最后一句中提到的内容?
    • 我现在可以自己回答了。将本机应用程序视为浏览器并使用 myapp-scheme://?sessionid=[our-own-session] 将使我们在重新打开应用程序时对会话劫持开放。我们还将构建自己的 Oauth2 流程,这听起来不是一个好主意。现在测试了 Andre 描述的方法,它需要更多的编码和配置,但效果很好!
    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2017-06-04
    • 2016-03-11
    • 2021-09-03
    • 2014-04-04
    • 2013-01-13
    相关资源
    最近更新 更多