Google oAuth2 API выдает 401 UNAUTHORIZED

Я пытаюсь реализовать API Google oAuth2 для входа в мое веб-приложение с использованием учетных данных Google через Spring Social.

Запрос к Google выглядит следующим образом

    googleConnectionFactory = new GoogleConnectionFactory(myKey, mySecret);
    oauthOperations = googleConnectionFactory.getOAuthOperations();
    final String redirectUri = "http://localhost/googleCallback";
    final OAuth2Parameters params = new OAuth2Parameters();
    params.setRedirectUri(redirectUri);
    params.setScope("https://www.googleapis.com/auth/userinfo.profile");
    final String authorizeUrl = oauthOperations.buildAuthorizeUrl(
            GrantType.AUTHORIZATION_CODE, params);
    response.sendRedirect(authorizeUrl);

После запроса меня перенаправляют на страницу входа в Google. URL показывает scope=https://www.googleapis.com/auth/userinfo.profile

После входа в систему пользователь перенаправляется обратно в мое веб-приложение, и метод ниже вызывается

    final String callbackUrl = "http://localhost/googleCallback";
    final AccessGrant accessGrant = oauthOperations.exchangeForAccess(code,
            callbackUrl, null);
    // THIS CRASHES WITH 401
    final Connection<Google> connection = googleConnectionFactory
            .createConnection(accessGrant);
    // THIS CRASHES TOO WITH 401
    new GoogleTemplate(accessGrant.getAccessToken()).userOperations().getUserProfile();

Я что-то пропустил?


person Simo L.    schedule 04.02.2013    source источник
comment
Заполняется ли accessGrant.accessToken Google?   -  person Maksym Demidas    schedule 04.02.2013


Ответы (1)


Мне пришлось вручную соединить токен доступа с URL-адресом API, чтобы заставить его работать. По-видимому, Spring Social не устанавливает токен доступа при отправке запроса...

LegacyGoogleProfile profile = new GoogleTemplate(
accessGrant.getAccessToken()).getRestTemplate().getForObject(
"https://www.googleapis.com/oauth2/v2/userinfo?access_token="
                    + accessGrant.getAccessToken(),
LegacyGoogleProfile.class);
person Simo L.    schedule 04.02.2013
comment
Несколько лучше (более безопасно) отправлять токен доступа в виде HTTP-заголовка (авторизация: носитель ‹токен идет сюда›). Причина в том, что включение его в URL-адрес означает, что он, вероятно, регистрируется на стороне сервера. - person Tim Bray; 05.02.2013
comment
Я согласен. Это был обходной путь. Я действительно не знаю, почему googleConnectionFactory.createConnection(accessGrant); вылетит, хотя они оба имеют одинаковый (и правильный) токен доступа. - person Simo L.; 05.02.2013
comment
Просто для ясности: проблема, с которой вы столкнулись, связана с Spring Social Google, а не с самой Spring Social. Spring Social Google – это проект сообщества, которым руководит Габриэль Аксель. Я уверен, что Габриэль был бы рад узнать об этой проблеме. Могу ли я предложить вам отправить вопрос или (еще лучше) запрос на включение в его проект на github. com/GabiAxel/spring-social-google. - person Craig Walls; 11.02.2013