如何从AuthorizationCodeMvcApp.AuthorizeAsync()正确获取用户凭据? [Google + / Gmail API]

时间:2018-11-04 01:22:10

标签: .net asp.net-mvc google-oauth gmail-api

我正在尝试将Google+和Gmail API集成到我的应用程序中,以便用户可以使用其Google帐户登录并从该应用程序内发送电子邮件。

我尝试遵循官方指南和文档,并且成功实施了外部登录后,在尝试设置Gmail服务时,我在获取用户的凭据方面有些卡住(坦白地说,我发现文档尚不清楚,因此我可能没有看到真正明显的东西)。

我使用过的资源:

Configuring OAuth 2.0 for .NET

Sending emails with Gmail API


问题:

var authState = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).AuthorizeAsync(token);的执行结束后,authState.Credential属性始终等于 null

FlowMetadata实现

    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,我该怎么做才能正确进行授权? 我很高兴指出任何错误,或者只是对这个问题有所了解。 预先感谢。

0 个答案:

没有答案