我构建了一个 Azure 函数来检索我的 Graph API 令牌,以便我可以用它发送电子邮件。目标是公司中的其他人不必每天手动访问 Graph Explorer 来检索令牌并粘贴它。
我正在使用此代码来检索令牌。
private static async Task<string> GetGraphAccessToken(ILogger log)
{
var clientId = Environment.GetEnvironmentVariable("ClientId");
var clientSecret = Environment.GetEnvironmentVariable("ClientSecret");
var tenantId = Environment.GetEnvironmentVariable("TenantId");
var tokenEndpoint = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token";
var body = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("client_id", clientId),
new KeyValuePair<string, string>("scope", "https://graph.microsoft.com/.default"),
new KeyValuePair<string, string>("client_secret", clientSecret),
new KeyValuePair<string, string>("grant_type", "client_credentials"),
});
HttpResponseMessage response = await httpClient.PostAsync(tokenEndpoint, body);
string responseContent = await response.Content.ReadAsStringAsync();
var tokenResult = JsonConvert.DeserializeObject<dynamic>(responseContent);
return tokenResult.access_token;
}
问题是:我正在取回令牌,但该令牌与下面列出的 Graph Explorer 中的令牌不匹配:
我很难弄清楚为什么两个令牌不匹配。我尝试使用返回的令牌发送电子邮件,但收到错误的请求响应。
从下一行开始,您使用客户端凭据流程,这意味着您需要具有仅应用程序权限,如https://learn.microsoft.com/en-us/entra/identity-platform/permissions-consent-overview中所述
新的KeyValuePair
并且 Graph Explorer 将使用委托权限,因此令牌不会相同。如果您想查看令牌内的内容以及它对哪些资源拥有哪些权限,请使用 jwt.io
如果您想使用您的应用程序发送邮件,那么您需要为您使用的客户端授予应用程序权限
var clientId = Environment.GetEnvironmentVariable("ClientId");
您应该在令牌中看到的是角色中的 Mail.Send,例如
从安全角度来看,最好的做法是将应用程序的范围缩小到只能访问它需要的邮箱,请参阅https://learn.microsoft.com/en-us/graph/auth-limit-mailbox-访问