我正在尝试将Google+和Gmail API集成到我的应用程序中,以便用户可以使用其Google帐户登录并从该应用程序内发送电子邮件。
我尝试遵循官方指南和文档,并且成功实施了外部登录后,在尝试设置Gmail服务时,我在获取用户的凭据方面有些卡住(坦白地说,我发现文档尚不清楚,因此我可能没有看到真正明显的东西)。
我使用过的资源:
Configuring OAuth 2.0 for .NET
var authState = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).AuthorizeAsync(token);
的执行结束后,authState.Credential属性始终等于 null 。
public class AppFlowMetadata : FlowMetadata
{
public override IAuthorizationCodeFlow Flow
{
get
{
return _flow;
}
}
private readonly IAuthorizationCodeFlow _flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer()
{
ClientSecrets = new Google.Apis.Auth.OAuth2.ClientSecrets
{
ClientId = "id-placeholder",
ClientSecret = "secret-placeholder"
},
DataStore = new FileDataStore("Google.Apis.Auth.Data", true),
Scopes = new string[]{
GmailService.Scope.GmailSend,
GmailService.Scope.GmailCompose,
GmailService.Scope.GmailModify
}
});
public override string GetUserId(Controller controller)
{
return controller.User.Identity.GetUserId();
}
}
[HttpPost]
private async Task<ActionResult> SendEmail(CancellationToken token, MailMessage email)
{
var authState = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata())
.AuthorizeAsync(token);
if (authState.Credential == null) // <<- it's always true, so it always gets redirected
return Redirect(authState.RedirectUri);
var service = new GmailService(new Google.Apis.Services.BaseClientService.Initializer() {
ApplicationName = "MyApp",
HttpClientInitializer = authState.Credential
});
var message = Base64UrlEncode(email);
await service.Users.Messages.Send(message, "me").ExecuteAsync();
return new EmptyResult();
}
如果我猜怎么着,我会把赌注押在GetUserId方法上(因为在运行AuthorizeAsync时会用到它),尽管在那种情况下,我真的不知道应该如何实现。
因此,回到最初的问题-谁能告诉我为什么我在那里返回null,我该怎么做才能正确进行授权? 我很高兴指出任何错误,或者只是对这个问题有所了解。 预先感谢。