Oauth 令牌访问

Oauth token accessing

我想获取访问令牌以使用它使用 Microsoft Graph 从 Outlook 中获取电子邮件 api。我的应用程序将是基于控制台的 c# 应用程序,它将在每 20 分钟后自动 运行 并获取电子邮件。

我是 c# 和 microsoft graph 的新手,这是我与这些技术相关的第一个任务。

问题是:

当我尝试使用 client_Credentials 获取令牌时,我成功地做到了,但现在该令牌已过期,我想获得新令牌,如果我尝试生成新令牌,它是 return只收过期的。

相关代码:

result = await context.AcquireTokenAsync(resourceUri, clientCredential);

使用 AcquireTokenSilentAsync 方法 return 作为错误: "Failed to acquire token silently as no token was found in the cache. Call method AcquireToken."

相关代码:

result = await authContext.AcquireTokenSilentAsync(resourceUri, clientId);

我的问题:

  1. 使用客户端凭证访问令牌是否是满足我需求的正确方法?

  2. 我读到过使用 client_Credentials 我们不需要 refresh_token,每次我们尝试连接时都会得到新的令牌。

  3. 如何在每次连接时获取新令牌?

  4. 任何关于如何处理我的主要 objective 的额外建议都将受到热烈欢迎。

我附上我的代码示例:

static async Task getAccessToken()
{
    authContext = new AuthenticationContext("https://login.microsoftonline.com/<tenantId>");
    try
    {
        result = await authContext.AcquireTokenSilentAsync(resourceUri, clientId);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
        try
        {

            result = await authContext.AcquireTokenAsync(resourceUri, clientCredential);

            Console.WriteLine("" + result.AccessToken+"\n\n");
        }
        catch (Exception e)
        {
            Console.WriteLine("\n AcquireTokenAsync failed\n");
            Console.WriteLine(""+e);
        }
    }
    if (result == null)
    {
        Console.WriteLine("Canceling attempt to get access token.\n");
        return;
    }
    Console.WriteLine(result.AccessToken);

}

您正在混合使用两种不同的 OAuth 流程(授权代码和客户端凭据)。您应该只需要使用正确的凭据调用 AcquireTokenAsync。每当你需要一个新的令牌(每个令牌大约一个小时),你重新执行这个方法来获得一个新的令牌:

static async Task<AuthenticationResult> getAccessToken()
{
    ClientCredential clientCredential = new ClientCredential("YOUR_APP_ID", "YOUR_APP_SECRET");
    AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/YOUR_TENANT_ID");
    AuthenticationResult result = null;

    try
    {
        result = await authContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }

    if (result == null)
        Console.WriteLine("Canceling attempt to get access token.");
    else
        Console.WriteLine(result.AccessToken);

    return result;
}