【问题标题】:Use a Azure AD Bearer Token to access O365 Exchange REST APIs (mail, contacts, etc)使用 Azure AD 不记名令牌访问 O365 Exchange REST API(邮件、联系人等)
【发布时间】:2015-01-13 21:50:28
【问题描述】:

我正在使用 Azure AD 在 O365 中预配和许可新用户,它运行良好,但是我需要一些进一步的 O365 功能(即能够导出用户的联系人)。我注意到您的应用有权执行此操作:

我可以获得一个不记名令牌来执行与此代码类似的所有其他 REST 调用(在 ruby​​ 中使用 httparty):

domain = "example.com"
api_version = "1.5"
auth_url = "https://login.windows.net/#{domain}/oauth2/token?api-version=#{api_version}"
auth_body = {"grant_type" => "client_credentials", "client_id" => @client_id, "client_secret" => @client_secret}
auth_headers = {"Content-Type" => "application/x-www-form-urlencoded"}
token_resp = HTTParty.post(auth_url, :headers => auth_headers, :body => auth_body)
bearer_token = "Bearer #{token_resp['access_token']}"

它在拨打https://graph.windows.net/ 时效果很好,但是当我尝试在 O365 Exchange 上拨打电话时:

request_headers={"Authorization" => bearer_token, "Content-Type"=>"application/json"}
request = HTTParty.get("https://outlook.office365.com/api/v1.0/users/user@example.com", :headers => request_headers)

request = HTTParty.get("https://api.office.com/discovery/v1.0/me/services", :headers => request_headers)

我收到以下回复:

HTTParty::Response:0x7fea2f8b0e40 parsed_response={"error"=>{"code"=>"-2147024891, System.UnauthorizedAccessException", "message"=>"访问被拒绝。你做 无权执行此操作或访问此 资源。"}}, @response=#, @headers={"cache-control"=>["private, max-age=0"], “传输编码”=>[“分块”], "content-type"=>["application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8"], "expires"=>["Mon, 29 Dec 2014 19 :27:04 GMT"], "last-modified"=>["星期二, 2015 年 1 月 13 日 19:27:04 GMT"], "服务器"=>["Microsoft-IIS/8.0"], "x-correlationid"=>["595d3bd9-94f7-40fe-b4ed-c3a28cc74cdb"], "x-usersessionid"=>["595d3bd9-94f7-40fe-b4ed-c3a28cc74cdb"], "x-officefe"=>["OdcFrontEnd_IN_10"], "x-officeversion"=>["16.0.3705.3001"], "x-officecluster"=>["scus-odc.officeapps.live.com"], "p3p"=>["CP=\"CAO DSP COR ADMa DEV CONi TELi CUR PSA PSD TAI IVDi OUR SAMi BUS DEM NAV STA UNI COM INT PHY ONL FIN PUR\""], "odata-version"=>["4.0"], "x-aspnet-version"=>["4.0.30319"], "x-powered-by"=>["ASP.NET"], "date"=>["2015 年 1 月 13 日星期二 19:27:03 GMT"], "connection"=>["close"]}>

我在这里遗漏了什么吗?如何使用我的应用程序的不记名令牌来访问 Exchange Online API?有这方面的文档吗?我似乎找不到关于这个主题的任何内容。

【问题讨论】:

    标签: ruby ms-office office365 azure-active-directory


    【解决方案1】:

    “拥有对用户邮箱的完全访问权限”需要管理权限。我建议关闭该权限并再试一次。

    【讨论】:

    • 总的来说,我认为所有“完全访问 *”权限可能都需要管理员权限。无论如何,我要标记这个线程给我的O365朋友看看他们是否可以看看。谢谢!
    • 我是否可能需要使用对我想要提取信息的帐户具有完全访问权限的某种帐户进行身份验证?我正在尝试使用应用程序令牌,但我开始认为它只需要一个用户令牌
    • 应用令牌不起作用,您在此处设置的权限已委托
    【解决方案2】:

    目前,用户自己需要登录并授予您的应用访问联系人 API 的权限。我们正在努力尽快发布仅限应用的权限(类似于 Graph 现在的权限)。

    【讨论】:

    • 有道理。我可以像模拟帐户一样使用对我想要获取信息的帐户具有完全访问权限的帐户吗?
    • 还没有。一旦仅应用程序开始运行,您就根本不需要帐户:)
    • 预计到达时间是多少?
    • “很快”。对不起,我不能更具体。如果您想尽快了解,请在 Twitter 上关注我 (@JasonJohMSFT) 或观看我们博客的 RSS 源 (blogs.msdn.com/b/exchangedev)。
    • 不是在后台实现一些繁重而复杂的东西,这可以是“管理同意向导”还是“管理注册向导”?当管理员选择用户列表或选择“所有用户”选项、应用程序和同意操作(允许/撤消)时,向导会从同意数据库(实际上是应用程序的用户列表)中添加/删除记录。顺便说一句,这些记录可以标有“byOrganization”等标志,以防止用户修改此记录并让用户知道为什么为他/她“安装”了这个应用程序?......可以这样实现吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2023-02-02
    • 2020-10-07
    • 2012-02-28
    • 1970-01-01
    • 2020-08-20
    • 2019-10-06
    相关资源
    最近更新 更多