2015-05-03 1 views
1

Я хочу, чтобы аутентифицировать пользователя с помощью логина Google, я получаю код авторизации от внешнего интерфейса, и я хочу обменять его на токен доступа с помощью Google.Получить токен Google через веб-интерфейс .NET, ошибка redirect_uri_mismatch

Это мой код:

[Route("google")] 
public object Google(AuthModel model) { 
    IAuthorizationCodeFlow flow = 
    new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer { 
     ClientSecrets = new ClientSecrets { 
      ClientId = model.ClientId, 
      ClientSecret = Constants.Constants.GOOGLE_SECRET 
     }, 
     Scopes = new[] { "https://www.googleapis.com/auth/plus.login" } 
    }); 
    var token = flow.ExchangeCodeForTokenAsync("", model.Code, "postmessage", 
        CancellationToken.None).Result; 
    return token.AccessToken; 
} 

При вызове метода flow.ExchangeCodeForTokenAsync я получаю ошибку

{"Error:\"redirect_uri_mismatch\", Description:\"\", Uri:\"\""} 

Я не понимаю, где я могу определить перенаправление URL? У меня провести несколько часов в googleing вопрос и отвечает на все говорят, что я должен определить некоторые URL-адреса в моем аккаунте приложений Google, где у меня есть на данный момент:

Redirect URIs 
http://localhost:53906 
http://localhost:53906/authcallback 
+0

Третий параметр [ExchangeCodeForTokenAsync] (https://developers.google.com/api-client-library/dotnet/reference/1.9.1/classGoogle_1_1Apis_1_1Auth_1_1OAuth2_1_1Flows_1_1AuthorizationCodeFlow#ae800a73ce82d01e0329e19cc68b02a2c) должно быть URI перенаправления, я не думаю, что «postmessage» - это значение, которое вы хотите использовать. – abraham

+0

Посмотрите в консоли разработчика, чтобы определить перенаправление uri –

ответ

0

Клиентская библиотека определяет сам по себе, где вы отправляете ваш запрос. Поэтому вам не нужно применять его. Вы сообщаете Google, которые перенаправляют URI, которые вы будете использовать с Google Developer console. Похоже, вы это сделали.

Возможно, ваша проблема связана с тем, что в Visual Studio есть привычка к случайному изменению номера порта. Вы можете исправить это в настройках вашего проекта.

OR

Перейдите в Google Developer Console. Создайте файл Client ID for native application, используя этот идентификатор клиента во время тестирования на локальном хосте. После того, как вы выйдете на веб-сайт для производства, вернитесь к Client ID for web application

Причина, по которой это работает: Client ID for native application позволяет подключаться из всех мест, поэтому не имеет значения, изменит ли Visual Studio ваш порт.

0

Для меня единственное, что сработало, - это поставить тот же параметр url для TokenResponse, что и для Credentials. Ничего больше не работало - я пробовал «postmessage» в качестве URL-адреса, затем ссылался на некоторые другие действия на моем сайте, даже без URL-адреса. Ничего не получилось.

Когда я набрал тот же URL-адрес, что и для учетных данных, он работал как шарм.

Код:

ClientSecrets secrets = new ClientSecrets 
{ 
ClientId = "***", 
ClientSecret = "***" 
}; 
IEnumerable<string> scopes = new[] { PlusService.Scope.UserinfoEmail, PlusService.Scope.UserinfoProfile }; 

IAuthorizationCodeFlow flow = 
new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer 
{ 
    ClientSecrets = secrets, 
    Scopes = scopes 
});        

TokenResponse token = flow.ExchangeCodeForTokenAsync("", code, 
"https://localhost:44388/TestLogin/Redirect", //This is the same url that I have for credentials 
    CancellationToken.None).Result; 

 Смежные вопросы

  • Нет связанных вопросов^_^