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