检索 Graph API 访问令牌以发送电子邮件

问题描述 投票:0回答:1

我构建了一个 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 中的令牌不匹配:

在此输入图片描述

我很难弄清楚为什么两个令牌不匹配。我尝试使用返回的令牌发送电子邮件,但收到错误的请求响应。

c# microsoft-graph-api
1个回答
0
投票

从下一行开始,您使用客户端凭据流程,这意味着您需要具有仅应用程序权限,如https://learn.microsoft.com/en-us/entra/identity-platform/permissions-consent-overview中所述

新的KeyValuePair(“grant_type”,“client_credentials”),

并且 Graph Explorer 将使用委托权限,因此令牌不会相同。如果您想查看令牌内的内容以及它对哪些资源拥有哪些权限,请使用 jwt.io

如果您想使用您的应用程序发送邮件,那么您需要为您使用的客户端授予应用程序权限

var clientId = Environment.GetEnvironmentVariable("ClientId");

您应该在令牌中看到的是角色中的 Mail.Send,例如

enter image description here

从安全角度来看,最好的做法是将应用程序的范围缩小到只能访问它需要的邮箱,请参阅https://learn.microsoft.com/en-us/graph/auth-limit-mailbox-访问

© www.soinside.com 2019 - 2024. All rights reserved.