【问题标题】:can't acquire a valid access token for microsoft api无法获取 microsoft api 的有效访问令牌
【发布时间】:2019-11-29 12:34:01
【问题描述】:

我想将 Outlook 联系人添加到我的 ionic/angular 网络应用程序中。我正在尝试使用隐式流获取 microsoft api 的访问令牌以访问用户的联系人。到目前为止,我已经尝试了以下方法:

  1. 使用此 url 从重定向获取 url 参数中的访问令牌(用户登录后)
  "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?"
  +"client_id={CLIENT_ID_HERE}"
  +"&response_type=token"
  +"&redirect_uri=http%3A%2F%2Flocalhost%3A8100%2F"
  +"&scope=offline_access openid contacts.read contacts.read.shared user.read"
  +"&nonce=89289"//tried both with and without this
  +"&response_mode=fragment";

我在重定向 url 中获得了一个访问令牌,但它实际上是无效的,例如:

EwBoA8l6BAAUO9chh8cJscQLmU%2bLSWpbnr0vmwwAASwN7zn/GFDP4wdOkrbA8xsurg0RceNlSsJiBj8uqZkK2E%2bmWTXjrj89FuiSlBcKqAe6dyuEbTOn8YBu3xApWaBKZjuP5lJZnAnWZX80Il7VtWMh2UuK/s4qxOZRYcgJEhwe8iTrPOGofm5Z3oU2o1MzGpSa6qaR1AleeKF9q0hZoV99BKLfRUOueK7LRwpnF4mGjLjTevNCUDGIo1N38FPH5bFPhSfAOVDSV%2bw7ZZO6NAS5Vo6HdgbPWC3Eml9Ix4twyzpgf7e4Q0l3oi%2b23iPtTvyNV16cEtt9jehdZ1TjSLdMj92Yc7e18Y%2bwV1SGav1qZ2Lyd/e3xNDmZz1P%2bSkDZgAACIkGgjdNZrtHOALgj5s3vZkDiURxDQzucVxbzf/p1XCG9qfCStUazMWbp9KlGkpIgHyigTVJfUVjYwht8X77wC3Oa%2btShphq2myn4C7LZp7nfpwGz4bSW0lx42SG2ADn33qu2hh4Mc%2bdJskI4pxGOUnurKnxFH0sxKpCisIIiWylPOgiOqCzH9AGyEaat91glrwzaHfKXXgzMeO88PeEjZ5Rfj0q4dxd4OTv67E8cp%2bXeYhhHerElKMi2LJmt65heTfwLOd7ErVawl9dS77nyMNp1OCow%2bvSysLuvHNCzN9gsUtMgH7a0C78t6cm1NiNsa8Yzk2yZ%2bjPiiNGgilvyv1zSMvAwYrcGjSW/yHY%2bQfn0ijEeo3Qq2tczoq/8/mx3kV50qNla5BWHltaMvwqxxQqk/ZXIJrph9qQsnPcRJcjtvXaSatMPwFoiBYLqTyezcYq6rbvLxbsiEhtE9pQMvMpmu2lzbEdnGYKtMQVjIbBJB7brzFDJ%2bmG2YdLPA9vmsqrmOJM8ZiftWRrDW9alMrml%2bcscmO1vqJuftn3uylvhnAQZP3q40CicqyEcrwSBA29%2bFQGbG/BDIHH0rtUXPsMkwKneJYluVXfMbxUlUxUJhCS79Dd4Jjrk3RX7QWj1WwEz9WlYAwyP0s/PnqPQOVodnwMaHNo%2bV2Xk1/5xi5dcU/Tt2TPJvCvHfS7p4i3%2bKlwTgn2llRMFkVFbf32BM2oaQPlSL7CPDU27IPGoW1xYSYa7ZdNjqvBGak1UNNee%2bStggI%3d
  1. 与上述类似,但我从中得到了 id_token(所以改为 response_type=id_token)。然后我使用带有此 url 的 GET 请求静默请求访问令牌:
      "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?";
      "client_id={CLIENT_ID_HERE}"
      +"&response_type=token"
      +"&redirect_uri=http%3A%2F%2Flocalhost%3A8100"
      +"&scope=offline_access openid contacts.read contacts.read.shared user.read"
      +"&response_mode=fragment"
      +"&prompt=none";

我收到一个 CORB 错误(我在控制台中看到),但在网络选项卡中,它显示状态代码为 200。不知何故,请求方法显示为 OPTIONS(即使我发出了 GET 请求)。我不确定这是为什么。

我不确定我做错了什么,但有人知道我如何获得有效的访问令牌吗?

Access to XMLHttpRequest at 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=XXXXX
&response_type=token&redirect_uri=http%3A%2F%2Flocalhost%3A8100&scope=offline_access%20openid%20contacts.read
%20contacts.read.shared%20user.read&response_mode=fragment&prompt=none' from origin 'http://localhost:8100' has been 
blocked by CORS policy: Response to preflight request doesn't pass access control check: No 
'Access-Control-Allow-Origin' header is present on the requested resource.


Cross-Origin Read Blocking (CORB) blocked cross-origin response 
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=XXXX&response_type=token&redirect_uri=
http%3A%2F%2Flocalhost%3A8100&scope=offline_access%20openid%20contacts.read%20contacts.read.shared%20user.read
&response_mode=fragment&prompt=none with MIME type text/html. See
https://www.chromestatus.com/feature/5629709824032768 for more details.

【问题讨论】:

  • 您的代码需要使用户被导航/重定向到https://login.microsoftonline.com/common/oauth2/v2.0/authorize,在那里他们手动登录,然后重定向回您的前端,对吗?请参阅stackoverflow.com/a/47821607/441757 等处的答案。通常这意味着您需要用户关注/使用的前端 UI 中的按钮或链接。但是无论你现在拥有什么前端代码,它都不会那样做;相反,它会导致对该 URL 发出 XHR 请求。据我了解,这是行不通的,并且故意不支持。
  • 另请参阅stackoverflow.com/a/41986679/441757stackoverflow.com/a/38319300/441757 上的答案和docs.microsoft.com/en-us/azure/active-directory/develop/… 上的文档:“Microsoft 身份平台端点不支持 CORS 请求,因此进行 AJAX 调用以获取和刷新令牌是不可能的。相反,您可以使用隐藏 iframe 中的隐式流来获取其他 Web API 的新令牌”
  • @sideshowbarker 我正在使用隐式流程(或至少尝试使用)。当我从我的角度服务发出获取请求时,它给了我一个 CORB(有问题显示的错误)。由于对该请求的响应是登录页面,所以我正在做的是当用户单击按钮时,它会在同一页面中打开 url。即离开我的应用程序并转到微软登录页面。
  • @sideshowbarker 至于你所说的我的代码导致发出 XHR 请求:我尝试了两种方式。第一个只是单击按钮导致应用程序在同一个选项卡中打开该 url(就像你说的那样)。在这种情况下,它会在 url 中返回一个访问令牌。问题是,它无效(基本上是我尝试的第一个选项,我已经在问题中显示了结果)。也许我表达问题的方式令人困惑。基本上,我想要一个有效的访问令牌。方法 1 返回一个令牌,但那是无效的。方法 2 给出了一个 CORB 错误。不知道下一步该做什么

标签: angular azure oauth-2.0 cors microsoft-graph-api


【解决方案1】:

您没有指定使用哪个 API 来获取 Outlook 联系人,所以我假设它是一些类似这样的 Graph API:

https://docs.microsoft.com/en-us/graph/api/user-list-contacts?view=graph-rest-1.0&tabs=http

如果是这样,那么要获得有效的令牌,您需要将“common”替换为您的租户 ID

以下是对我有用的示例:

  "https://login.microsoftonline.com/{TENANT_ID_HERE}/oauth2/v2.0/authorize?"
  +"client_id={CLIENT_ID_HERE}"
  +"&response_type=code"
  +"&redirect_uri=http%3A%2F%2Flocalhost%3A8100%2F"
  +"&scope=offline_access openid contacts.read contacts.read.shared user.read"
  +"&state={STATE_HERE}
  +"&response_mode=query";

https://docs.microsoft.com/en-us/graph/auth-v2-user?context=graph%2Fapi%2F1.0&view=graph-rest-1.0

您从哪里获得“response_mode=fragment”和“response_type=token”?这甚至看起来都无效?

【讨论】:

  • 我正在使用隐式流程。您提供的第二个链接显示了一个 2 步过程,但 /token 端点在我发出请求时实际上给出了 CORS 错误,因此为避免这种情况,请使用此 docs.microsoft.com/en-us/azure/active-directory/develop/… 也,文档提到“路径中的 {tenant} 值的请求可用于控制谁可以登录应用程序。“所以如果我输入我的租户 ID,那么其他用户就无法登录,这不是我想要的。
猜你喜欢
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 2018-10-10
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
相关资源
最近更新 更多