Как правильно получить учетные данные пользователя из AuthorizationCodeMvcApp.AuthorizeAsync ()? [Google + / Gmail API] - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь интегрировать API Google+ и Gmail в свое приложение, чтобы пользователи могли войти в систему со своими учетными записями Google и отправлять электронные письма из приложения.

Я пытался следовать официальным руководствам и документам, и после успешной реализации внешнего входа в систему я немного застрял при получении учетных данных пользователя при попытке настроить службу Gmail (честно говоря, я нахожу документы довольно неясными, поэтому Возможно, я не вижу чего-то действительно очевидного).

Ресурсы, которые я использовал:

Настройка OAuth 2.0 для .NET

Отправка писем с помощью 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), хотя в этом случае я действительно не знаю, как это должно быть реализовано.

Итак, возвращаясь к первоначальному вопросу - может кто-нибудь сказать мне, почему я получаю нулевое значение там, и что я могу сделать, чтобы продолжить авторизацию должным образом? Я был бы признателен за указание на любые ошибки или просто пролить некоторый свет на эту тему. Заранее спасибо.

...