我正在运行一个OAuth对话框,该对话框允许用户登录。我希望将Auth令牌从DialogsClass.cs中获取到我的Bot.Cs类文件中,并使用它进行Graph调用。
我试图将令牌另存为字符串,并将其保存在对话框类中的本地文件中,然后在bot主类中将其读回,但是此解决方案似乎不是正确的方法。
瀑布步骤中的AuthDialog.cs:
var tokenResponse = (TokenResponse)stepContext.Result;
预期结果。将此令牌从Dialog类转移到MainBot.cs类,并用作字符串来进行Graph调用。
答案 0 :(得分:1)
您是否使用一个瀑布步骤来使用OAuthPrompt获取令牌,然后又使用另一步骤来调用其他类(您在其中进行图形api调用)? 为什么不能只将令牌传递给下游类?
如果中间还有其他步骤,则有多种解决方法:
答案 1 :(得分:1)
Microsoft建议不要将令牌存储在系统中,而是拨打oAuth提示
return await stepContext.BeginDialogAsync(nameof(OAuthPrompt), null, cancellationToken);
并在需要调用Graph API时获取最新令牌。在var tokenResponse = (TokenResponse)stepContext.Result;
中收到令牌后
您可以调用GraphClient类,该类将使用Authorization属性中的令牌创建Graph API客户端。
var client = new GraphClientHelper(tokenResponse.Token);
Graph Client实现:
public GraphClientHelper(string token)
{
if (string.IsNullOrWhiteSpace(token))
{
throw new ArgumentNullException(nameof(token));
}
_token = token;
}
private GraphServiceClient GetAuthenticatedClient()
{
var graphClient = new GraphServiceClient(
new DelegateAuthenticationProvider(
requestMessage =>
{
// Append the access token to the request.
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", _token);
// Get event times in the current time zone.
requestMessage.Headers.Add("Prefer", "outlook.timezone=\"" + TimeZoneInfo.Local.Id + "\"");
return Task.CompletedTask;
}));
return graphClient;
}
一旦创建了图形客户端,您就可以调用所需的图形api:
await client.CreateMeeting(meetingDetails).ConfigureAwait(false);
请参考以下示例代码: Graph Sample