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);
我的问题:
使用客户端凭证访问令牌是否是满足我需求的正确方法?
我读到过使用 client_Credentials 我们不需要 refresh_token,每次我们尝试连接时都会得到新的令牌。
如何在每次连接时获取新令牌?
任何关于如何处理我的主要 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;
}
我想获取访问令牌以使用它使用 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);
我的问题:
使用客户端凭证访问令牌是否是满足我需求的正确方法?
我读到过使用 client_Credentials 我们不需要 refresh_token,每次我们尝试连接时都会得到新的令牌。
如何在每次连接时获取新令牌?
任何关于如何处理我的主要 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;
}