Oauth2 поток без redirect_uri
Я создаю приложение для Android/iOS, которое связывается с сервером Node.js и хотело бы их безопасно идентифицировать на моем сервере с помощью Google (и/или Facebook) и OAuth2. Я просмотрел следующую документацию: https://developers.google.com/+/web/signin/server-side-flow
Мне не нужна авторизация, мне нужна только аутентификация (я только хочу удостовериться, что человек, звонящий в мой сервис Node.js, - это человек, которому, как они говорят). Чтобы добиться этого, если я правильно понимаю, я должен позволить пользователю войти в систему с помощью Google на стороне клиента, это даст ему код авторизации, который они затем могут дать моему серверу. Мой сервер может затем обменять этот код на access_token и, следовательно, получить информацию о пользователе. Я тогда гарантирую, что пользователь - человек, которым они говорят, что они.
Документация Google (ссылка выше) гласит: "В поле URI авторизованного перенаправления удалите значение по умолчанию. В этом случае оно не используется". Однако для того, чтобы мой сервер обменял код авторизации на access_token, он должен предоставить redirect_uri
, я что-то упустил?
Например, redirect_uri
бесполезен для игр Unity (поскольку вход в систему с помощью Google просто открывает новое "окно", которое закрывается при входе в систему, без перенаправления).
TL; DR Как вы используете OAuth2 для аутентификации пользователей между моим клиентом и моим сервером без перенаправления?
TL; DR Как вы используете OAuth2 для аутентификации пользователей между моим клиентом и моим сервером без перенаправления?
Вы не можете. OAuth требует, чтобы пользователь был перенаправлен на экран авторизации (и, возможно, входа), а затем перенаправлен обратно в ваше приложение.
Вы просмотрели эту документацию? https://developers.google.com/accounts/docs/OAuth2InstalledApp#choosingredirecturi
Выбор URI перенаправления
При создании идентификатора клиента в Google Developers Console два redirect_uris созданы для вас:
urn:ietf:wg:oauth:2.0:oob
иhttp://localhost
. Значение, используемое вашим приложением, определяет, как код авторизации возвращается в ваше приложение.
http://localhost
Это значение сигнализирует серверу авторизации Google, что код авторизации должен быть возвращен как параметр строки запроса для веб-сервер на клиенте. Вы можете указать номер порта без изменение конфигурации консоли Google Developers. Чтобы получить код авторизации с использованием этого URL-адреса, ваше приложение должно прослушивать на локальном веб-сервере. Это возможно для многих, но не для всех, платформ. Если ваша платформа поддерживает его, это рекомендуется механизм получения кода авторизации.
redirect_uri
может быть URL с настраиваемой схемой URL, для которой клиент зарегистрировал обработчик. Это описано здесь: Что такое URI перенаправления? как это применимо к iOS-приложению для OAuth2.0?. Речь идет не столько о "перенаправлении", сколько о конечной точке обратного вызова в ваше приложение.
У меня была эта проблема, и мне потребовались целые годы, чтобы найти решение "postmessage", которое Nepoxx упоминает в комментариях принятого ответа здесь.
Для уточнения вот что у меня сработало.
- Выполните шаги 1-6 здесь: https://developers.google.com/identity/sign-in/web/server-side-flow
- Установить библиотеку googleapis
npm install --save googleapis
- Для обмена токенами на стороне сервера сделайте это:
var googleapis = require('googleapis');
var OAuth2 = googleapis.auth.OAuth2;
var oauth2Client = new OAuth2(
GOOGLE_SSO_CLIENT_ID,
GOOGLE_SSO_CLIENT_SECRET,
'postmessage' // this is where you might otherwise specifiy a redirect_uri
);
oauth2Client.getToken(CODE_FROM_STEP_5_OF_INSTRUCTIONS, function(err, tokens) {
// Now tokens contains an access_token and an optional refresh_token. Save them.
});
И это станет действительно легко, если вы используете VueJS с https://github.com/guruahn/vue-google-oauth2
Сторона клиента
import GAuth from 'vue-google-oauth2'
Vue.use(GAuth, {
clientId: 'xxxxxxx.apps.googleusercontent.com',
scope: 'profile',
})
async signWithGoogle() {
const code = await this.$gAuth.getAuthCode() //
console.log(code ) // { code: 'x/xxxxxxxxxx' }
// send the code to your auth server
// and retrieve a JWT or something to keep in localstorage
// to send on every request and compare with database
}
Серверная сторона
import { google } from 'googleapis'
const oauth2Client = new google.auth.OAuth2(GOOGLE_ID, GOOGLE_SECRET, 'postmessage')
google.options({ auth: oauth2Client })
async function getAccount(code) {
// the code you sent with the client
const { tokens } = await oauth2Client.getToken(code)
oauth2Client.setCredentials(tokens)
const oauth2 = google.oauth2({ version: 'v2' })
const { data: { id } } = await oauth2.userinfo.get()
// there you have the id of the user to store it in the database
// and send it back in a JWT
}
Посмотрите другие вопросы по меткам node.js google-oauth passport.js passport-facebook или Задайте вопрос