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 для аутентификации пользователей между моим клиентом и моим сервером без перенаправления?

+7
источник поделиться
5 ответов

TL; DR Как вы используете OAuth2 для аутентификации пользователей между моим клиентом и моим сервером без перенаправления?

Вы не можете. OAuth требует, чтобы пользователь был перенаправлен на экран авторизации (и, возможно, входа), а затем перенаправлен обратно в ваше приложение.

+4
источник

Вы просмотрели эту документацию? 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-адреса, ваше приложение должно прослушивать на локальном веб-сервере. Это возможно для многих, но не для всех, платформ. Если ваша платформа поддерживает его, это рекомендуется механизм получения кода авторизации.

+3
источник

redirect_uri может быть URL с настраиваемой схемой URL, для которой клиент зарегистрировал обработчик. Это описано здесь: Что такое URI перенаправления? как это применимо к iOS-приложению для OAuth2.0?. Речь идет не столько о "перенаправлении", сколько о конечной точке обратного вызова в ваше приложение.

+1
источник

У меня была эта проблема, и мне потребовались целые годы, чтобы найти решение "postmessage", которое Nepoxx упоминает в комментариях принятого ответа здесь.

Для уточнения вот что у меня сработало.

  1. Выполните шаги 1-6 здесь: https://developers.google.com/identity/sign-in/web/server-side-flow
  2. Установить библиотеку googleapis npm install --save googleapis
  3. Для обмена токенами на стороне сервера сделайте это:
    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.
    });
+1
источник

И это станет действительно легко, если вы используете 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
}
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос