Используйте токен, полученный от клиента JavaScript, чтобы создать социальную связь на сервере - PullRequest
0 голосов
/ 31 мая 2018

У меня есть веб-страница с использованием PHP / JavaScript, которая может успешно выполнять процесс входа в Google на стороне клиента.Затем я хотел бы переслать полученный токен бэкэнду, который использует Spring-Social, чтобы создать социальную связь и иметь возможность вызывать API, к которым приложение было авторизовано.Мне удалось сделать именно это с обоими Facebook (OAUTH2) и Twitter (OAUTH1), оба работают без нареканий, но для Google я всегда получаю ответ 401 при попытке создать соединение.Код на сервере выглядит следующим образом:

AccessGrant accessGrant = new AccessGrant(accessToken);
connection = ((OAuth2ConnectionFactory<?>) connectionFactory).createConnection(accessGrant);

Код на клиенте выглядит примерно так:

    function onSignIn(googleUser) {
        var profile = googleUser.getBasicProfile();
        console.log('ID: ' + profile.getId());
        console.log('Name: ' + profile.getName());
        console.log('Email: ' + profile.getEmail());

        var access_token = googleUser.getAuthResponse().id_token;
        var xhr = new XMLHttpRequest();
        xhr.open('POST', 'http://localhost/signin/google');
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.onload = function() {
            console.log('Signed in as: ' + xhr.responseText);
            console.log('access_token=' + access_token);
        };
        xhr.send('access_token=' + access_token);

    }

Большинство последних скопировано из документации Google о том, как проходить аутентификациюс внутренним сервером, найденным здесь: https://developers.google.com/identity/sign-in/web/backend-auth

Я отследил звонки внутри spring-social-google, и они привели к вызову REST на https://www.googleapis.com/oauth2/v2/userinfo, который отвечает 401 иследующий JSON:

{
    "error": {
        "errors": [{
            "domain": "global",
            "reason": "authError",
            "message": "Invalid Credentials",
            "locationType": "header",
            "location": "Authorization"
        }],
        "code": 401,
        "message": "Invalid Credentials"
    }
}

Я сам пытался вызвать тот же API-интерфейс REST, и я также получаю тот же ответ, так что это не проблема, которую отправляет spring-social-google.токен правильно, как я читал на некоторых других постах.

Я считаю, что проблема как-то связана с тем фактом, что JavaScript API дает мне «id_token», а REST API ожидает «access_token»».Однако я не нахожу способ получить токен доступа отдельно от id_token, и документация Google отправляет id_token на серверную часть.В googleUser.getAuthResponse () есть свойство "access_token" рядом с используемым свойством "id_token", но оно возвращается неопределенным.Этот документ, конечно же, не нацелен на весенний социал, поэтому я не говорю, что он неправильный, мне просто интересно, как правильно этого добиться.

Является ли весенний социальный виноват, если не можетиметь дело с id_token?

Не виноват ли я в том, что не вижу какого-то четкого способа получить access_token?

В любом случае, я чувствую, что я как-то близок, но все же решение кажется не совсем понятным.

Спасибо!

1 Ответ

0 голосов
/ 01 июня 2018

Ну, я нашел это.Кажется, что запись всего этого действительно споткнулась в моем мозгу ...

Проблема в том, что id_token не может заменить access_token.На мой вкус, документация Google может быть немного более ясной об этом в примере, который они показывают, но в итоге они объясняют это в фактической ссылке клиента на https://developers.google.com/identity/sign-in/web/reference

Ключ - логический параметр getAuthResponse (), который является необязательным и по умолчанию имеет значение false.Из документа:

includeAuthorizationData Необязательно: логическое значение, указывающее, всегда ли возвращать маркер доступа и области.По умолчанию токен доступа и запрошенные области не возвращаются, когда fetch_basic_profile имеет значение true (значение по умолчанию) и дополнительные области не запрашиваются.

Установив для этого параметра значение true в моем JS поле access_token, которое былоранее было задано неопределенное значение, и с помощью этого токена можно получить доступ к конечной точке / oauth2 / v2 / userinfo, а spring-social-google может правильно создать соединение, как и другие провайдеры.

Надеюсь, это поможет хотя бы кому-то другому.

...