【发布时间】:2023-02-02 23:44:13
【问题描述】:
我正在制作一个 Java 应用程序来发送邮件任何用户在 Microsoft 租户中,使用图形 API,所以我正在使用客户端凭据流(无需登录,自动发送)。 我在 Azure AD 中注册了一个应用程序,提供以下内容应用程序权限(未委托),检查每个项目的管理员同意:
- 邮件.发送
- 邮件读写
- 用户.Read.All
为了简单起见,我也尝试过在 Postman 中调用,但我遇到了与 Java 应用程序中相同的问题。我理所当然地认为我有一个有效的访问令牌(如果我尝试使用一个无效的访问令牌,我会得到一个401: Unauthorized)。以下是我从https://jwt.ms/获得的解码访问令牌,包括所有范围:
...
"roles": [
"Mail.ReadWrite",
"User.Read.All",
"Mail.Send"
],
...
这是我在 Java 中的代码:
String user = "/users/<my user id or my user principal name>";
UserRequestBuilder defaultUser = new UserRequestBuilder(graphClient.getServiceRoot() + user, graphClient, null);
//graphClient.me()
defaultUser
.sendMail(UserSendMailParameterSet
.newBuilder()
.withMessage(message)
.withSaveToSentItems(saveToSentItems)
.build())
.buildRequest()
.post();
我不能使用“我”目标(me() 方法),因为这是客户端凭证流,所以没有登录用户。我需要这样指定发件人:/users/{id | userPrincipalName}/sendMail。
Postman 中的调用是这样组成的:
方法:邮寄
网址:
- .https://graph.microsoft.com/v1.0/users/
{my user id or my user principal name}/sendMail
授权:
- 不记名令牌(我的访问令牌)
标头:
- 内容类型:应用程序/json
身体(JSON):
{
"recipient": <recipient email>,
"subject": "This is a test mail",
"from": <mail that created the tenant, app and access token>,
"text": "This is the messge body..."
}
这是来自服务器的响应(在 Postman 和 Java 应用程序中):
地位:405:方法不允许
身体:
{
"error": {
"code": "Request_BadRequest",
"message": "Specified HTTP method is not allowed for the request target.",
"innerError": {
"date": "2022-08-05T07:17:34",
"request-id": "XXXXXXXX-6075-4d13-83ed-XXXXXXXXXXXX",
"client-request-id": "XXXXXXXX-6075-4d13-83ed-XXXXXXXXXXXX"
}
}
}
注一:我还使用我的访问令牌通过 Postman 调用获得了我的用户 ID 和我的用户主体名称,
利用User.Read.All权限,调用如下:
https://graph.microsoft.com/v1.0/users
那是回应:
...
"userPrincipalName": "XXXXXX_XXXXXX.XXX#EXT#@sendClientCredMail.onmicrosoft.com",
"id": "XXXXXXXX-4457-4944-bb22-XXXXXXXXXXXX"
}
]
}
笔记2:请注意,如果我在通话中使用“主体名称”,则会收到 405,如果我使用“id”,则会收到404:未找到
在此先感谢您的帮助,我已经尝试了几个小时!
【问题讨论】:
-
您确定该用户有活动邮箱吗?
-
您能否分享查询详细信息客户端请求 ID 和时间戳
-
@bisi 你的问题得到答案了吗。我也面临着同样的问题。
标签: java oauth-2.0 microsoft-graph-api clientcredential