Microsoft Graph 使用客户端凭据流(应用程序权限)和个人帐户发送邮件
Microsoft Graph to send mail with Client Credential Flow (application permission) and personal account
我正在学习 Microsoft Graph,为此我使用 Graph Explorer and Postman。
使用 Graph Explorer : 我使用我的个人用户帐户 (hotmail) 登录。一旦连接,我就可以看到令牌。奇怪的是,当我在 jwt.io it cannot be decoded. Yet I can perform query like https://graph.microsoft.com/v1.0/me which returns me some infos of myself as a user (with http 200). Or this query https://graph.microsoft.com/v1.0/me/sendMail 中 copy/paste 这个令牌时,它允许我发送测试和接收测试邮件(使用 http 202)。所有这些请求都是“授权许可”。所以我在个人帐户 (hotmail) 上使用 Graph Explorer 没有任何问题。
With Postman : 这次我会用“应用程序权限”进行一些测试。我按照以下步骤操作:
在 Azure 门户上
第 1 步:应用程序注册/新注册/我给一个名字/选择第三种帐户类型(任何组织目录中的帐户和个人 Microsoft 帐户)/单击注册按钮
第 2 步:Api 权限/添加权限/Microsoft Graph/应用程序权限/Mail.Send(以任何用户身份发送邮件)
第 3 步:Grand admin consent for...按钮激活权限
第 4 步:证书和机密/新客户端机密/输入描述/单击添加按钮
第 5 步:在 Postman 中获取令牌
POST
HEADERS
- Content-Type: application/x-www-form-urlencoded
BODY
- client_id:{my-client-id-here}
- client_secret:{my-client-secret-here}
- grant_type: client_credentials
- 范围:https://graph.microsoft.com/.default
好的,我得到了一个令牌
当 copy/paste 这个令牌在 jwt.io 我看到这个:
第 6 步:查询列出所有用户
获取
授权
- 不记名令牌:{bearer-token-received-previously}
HEADERS
- Content-Type: application/json
好的,我得到了所有用户的信息(如 json)
第七步:查询发送邮件
- POST
- 授权
- 不记名令牌:{bearer-token-received-previously}
- HEADERS
- Content-Type: application/json
- BODY (JSON)
{
"message": {
"subject": "This is my subject",
"body": {
"contentType": "Text",
"content": "This is my content"
},
"toRecipients": [
{
"emailAddress": {
"address": "thierry.langie@skynet.be"
}
}
],
"ccRecipients": [
]
},
"saveToSentItems": "false"
}
- 不正常错误:MailboxNotEnabledForRESTAPI - 此邮箱尚不支持 REST API
我想知道为什么会出现此错误? 我可以使用 Graph Explorer(使用委派权限时)而不是 Postman(使用应用程序权限时)发送电子邮件。
如下所示,我在 Azure 门户的企业应用程序 中授予管理员许可。
我在某处看到这个错误意味着用户在 EXO 云中没有邮箱。 EXO 是 O365 Exchange 在线云。因此,如果您在云中没有邮箱,O365 Exchange REST APIs 将不适用于这些用户。如果是这样,你会怎么做?
我有一个应该从共享邮箱发送邮件的 Web 应用程序。无论哪个用户连接,这始终是用于发送邮件的同一个邮箱。这就是我选择“应用程序许可”和“客户端凭据流”的原因。
如上所述,我使用我的个人帐户 (hotmail) 进行测试,但在生产中我将使用工作帐户(无法从我的开发环境访问)。
附带说明一下,我知道有一些库可以简化流程并避免使用 REST API 调用(url),但我认为这不能解释我面临的问题。
“MailboxNotEnabledForRESTAPI - 此邮箱尚不支持 REST API” 此错误消息表示您用于发送电子邮件的电子邮件帐户没有 Exchange Online 许可证。
对于个人帐户,您应该使用已在 Microsoft Graph Explorer 中尝试过的委派权限。请参阅此处 Permissions。
.
如果我们将个人帐户作为来宾用户添加到您的租户,虽然我们可以 Assign a license to a guest user(我假设我们可以将 EXO 许可证分配给来宾用户),但 EXO 中托管的邮箱不同于个人账户的邮箱。它们完全是 2 个独立的邮箱。事实上我没有给客人分配EXO许可证。
所以在这种情况下,客户端凭据流适用于 AAD 用户,而不是个人帐户。
更新:
对于使用委托权限的个人帐户(您已在 Microsoft Graph Explorer 中尝试过),权限端点为 https://login.microsoftonline.com/commonm/oauth2/v2.0/authorize
或 https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize
。
但是当您使用具有应用程序权限的客户端凭证流时,您必须在请求中指定租户 ID https://login.microsoftonline.com/{tenant id}/oauth2/v2.0/authorize
。
虽然您的个人账户作为来宾用户添加到租户中,但它没有 EXO 许可证(根据测试我们无法为其分配 EXO 许可证),因此不会托管在 O365 .
这就是为什么我们不能通过个人帐户使用客户端凭据流。
我正在学习 Microsoft Graph,为此我使用 Graph Explorer and Postman。
使用 Graph Explorer : 我使用我的个人用户帐户 (hotmail) 登录。一旦连接,我就可以看到令牌。奇怪的是,当我在 jwt.io it cannot be decoded. Yet I can perform query like https://graph.microsoft.com/v1.0/me which returns me some infos of myself as a user (with http 200). Or this query https://graph.microsoft.com/v1.0/me/sendMail 中 copy/paste 这个令牌时,它允许我发送测试和接收测试邮件(使用 http 202)。所有这些请求都是“授权许可”。所以我在个人帐户 (hotmail) 上使用 Graph Explorer 没有任何问题。
With Postman : 这次我会用“应用程序权限”进行一些测试。我按照以下步骤操作:
在 Azure 门户上
第 1 步:应用程序注册/新注册/我给一个名字/选择第三种帐户类型(任何组织目录中的帐户和个人 Microsoft 帐户)/单击注册按钮
第 2 步:Api 权限/添加权限/Microsoft Graph/应用程序权限/Mail.Send(以任何用户身份发送邮件)
第 3 步:Grand admin consent for...按钮激活权限
第 4 步:证书和机密/新客户端机密/输入描述/单击添加按钮
第 5 步:在 Postman 中获取令牌
POST
HEADERS
- Content-Type: application/x-www-form-urlencoded
BODY
- client_id:{my-client-id-here}
- client_secret:{my-client-secret-here}
- grant_type: client_credentials
- 范围:https://graph.microsoft.com/.default
好的,我得到了一个令牌
当 copy/paste 这个令牌在 jwt.io 我看到这个:
第 6 步:查询列出所有用户
获取
授权
- 不记名令牌:{bearer-token-received-previously}
HEADERS
- Content-Type: application/json
好的,我得到了所有用户的信息(如 json)
第七步:查询发送邮件
- POST
- 授权
- 不记名令牌:{bearer-token-received-previously}
- HEADERS
- Content-Type: application/json
- BODY (JSON)
{
"message": {
"subject": "This is my subject",
"body": {
"contentType": "Text",
"content": "This is my content"
},
"toRecipients": [
{
"emailAddress": {
"address": "thierry.langie@skynet.be"
}
}
],
"ccRecipients": [
]
},
"saveToSentItems": "false"
}
- 不正常错误:MailboxNotEnabledForRESTAPI - 此邮箱尚不支持 REST API
我想知道为什么会出现此错误? 我可以使用 Graph Explorer(使用委派权限时)而不是 Postman(使用应用程序权限时)发送电子邮件。
如下所示,我在 Azure 门户的企业应用程序 中授予管理员许可。
我在某处看到这个错误意味着用户在 EXO 云中没有邮箱。 EXO 是 O365 Exchange 在线云。因此,如果您在云中没有邮箱,O365 Exchange REST APIs 将不适用于这些用户。如果是这样,你会怎么做?
我有一个应该从共享邮箱发送邮件的 Web 应用程序。无论哪个用户连接,这始终是用于发送邮件的同一个邮箱。这就是我选择“应用程序许可”和“客户端凭据流”的原因。
如上所述,我使用我的个人帐户 (hotmail) 进行测试,但在生产中我将使用工作帐户(无法从我的开发环境访问)。
附带说明一下,我知道有一些库可以简化流程并避免使用 REST API 调用(url),但我认为这不能解释我面临的问题。
“MailboxNotEnabledForRESTAPI - 此邮箱尚不支持 REST API” 此错误消息表示您用于发送电子邮件的电子邮件帐户没有 Exchange Online 许可证。
对于个人帐户,您应该使用已在 Microsoft Graph Explorer 中尝试过的委派权限。请参阅此处 Permissions。
如果我们将个人帐户作为来宾用户添加到您的租户,虽然我们可以 Assign a license to a guest user(我假设我们可以将 EXO 许可证分配给来宾用户),但 EXO 中托管的邮箱不同于个人账户的邮箱。它们完全是 2 个独立的邮箱。事实上我没有给客人分配EXO许可证。
所以在这种情况下,客户端凭据流适用于 AAD 用户,而不是个人帐户。
更新:
对于使用委托权限的个人帐户(您已在 Microsoft Graph Explorer 中尝试过),权限端点为 https://login.microsoftonline.com/commonm/oauth2/v2.0/authorize
或 https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize
。
但是当您使用具有应用程序权限的客户端凭证流时,您必须在请求中指定租户 ID https://login.microsoftonline.com/{tenant id}/oauth2/v2.0/authorize
。
虽然您的个人账户作为来宾用户添加到租户中,但它没有 EXO 许可证(根据测试我们无法为其分配 EXO 许可证),因此不会托管在 O365 .
这就是为什么我们不能通过个人帐户使用客户端凭据流。