У меня есть веб-страница с использованием 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?
В любом случае, я чувствую, что я как-то близок, но все же решение кажется не совсем понятным.
Спасибо!