【发布时间】:2019-11-06 09:48:53
【问题描述】:
在我们部门内,我们有一个 Classic ASP 网站,该网站一直在使用我们的公司 Google 帐户进行身份验证并将活动插入到我们的 Google 日历中。该组织刚刚从 Google 切换到 Office 365,我正在尝试将代码切换为使用 Outlook,但没有成功。
我可以使用访问令牌 GET https://graph.microsoft.com/v1.0/me 并查看基本资料,但如果我尝试阅读日历事件或发送电子邮件,我会看到以下消息:
"error": {
"code": "NoPermissionsInAccessToken",
"message": "The token contains no permissions, or permissions can not be understood."
我使用我的个人 Microsoft 帐户创建了一个 Azure 帐户并添加了一个应用程序。我将我的同事和我的公司帐户添加为来宾用户。我设置了所需的权限并做了管理员同意的事情:
然后我按照this page 上的步骤进行操作。
我第一次访问https://login.microsoftonline.com/{tenant id}/oauth2/v2.0/authorize,包括以下查询项:
client_id={client id}
response_type=code
redirect_uri={our URL}
response_mode=query
scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
state={number}
这会返回一个“代码”,我将其发送给https://login.microsoftonline.com/{tenant id}/oauth2/v2.0/token,包括:
grant_type=authorization_code
client_secret={client secret}
client_id={client id}
scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
state={same number as above}
redirect_uri={same URL as above}
code={code returned from /authorize}
这将返回 id、访问和刷新令牌。如果我使用https://jwt.ms/ 解码访问令牌,它似乎包含适当的受众和范围:
"aud": "https://graph.microsoft.com"
"scp": "Calendars.ReadWrite email Mail.Send openid profile User.Read"
...尽管我注意到在某些文档中没有“角色”条目。这是个问题吗?
然后我将访问令牌发送到https://graph.microsoft.com/v1.0/me,并带有以下标头:
"Authorization", "Bearer {access token}"
"Host", "graph.microsoft.com"
"Content-Type", "application/json"
"Prefer", "outlook.timezone Europe/London"
这将返回我的电子邮件地址等,但如果我将 URL 更改为其他任何内容,例如 /me/photo/$value、/me/calendar/events,或者尝试发送电子邮件,我会被告知有令牌中没有权限。
我看到还有其他类似的问题,但它们主要针对client_credentials 流程(我不确定这有什么不同),并且没有一个答案可以帮助我解决我的问题。
如果我明显遗漏了任何内容,或者我以错误的方式访问客户端的 Graph 数据,请告诉我?使用 Google 似乎很简单,但我发现 Microsoft 文档和示例的详细程度略低。
【问题讨论】:
-
您是否配置了 Exchange Online 邮箱?
-
所有来宾帐户(包括我用来登录以进行测试的帐户,并且出现错误)都有邮箱和日历 - 数据是从 Google 迁移到其中的帐户,但从那以后添加了一些东西。但是,作为 Azure 帐户所有者的帐户没有邮箱或日历。如果我使用该帐户登录 Web 应用程序,则在尝试使用 Graph 访问日历时会看到未指定的错误 500。
-
访客账户与普通账户不同。 Graph 无法访问另一个租户中的邮箱,因此如果您在租户 A 中与来自租户 B 的来宾进行身份验证,则它无法访问该用户的邮箱。 Graph 一次只能与一个租户对话。
-
感谢您的帮助 - 希望这将为我指明正确的方向。 Google 解决方案没有任何需要考虑的问题,这可能就是我苦苦挣扎的原因 - 每个用户都可以自行表示同意,无论是谁创建了帐户。
标签: azure-active-directory microsoft-graph-api