NodeJS 没有redirect_uri的Oauth2流

llew8vvj  于 2022-12-22  发布在  Node.js
关注(0)|答案(5)|浏览(187)

我正在创建一个与Node.js服务器通信的Android/iOS应用程序,并希望使用Google(和/或Facebook)和OAuth2在我的服务器上安全地识别它们。https://developers.google.com/+/web/signin/server-side-flow
我不需要授权,我只需要身份验证(我只想确保调用我的Node.js服务的人就是他们所说的那个人)。为了实现这一点,如果我理解正确的话,我必须让用户在客户端使用Google登录,这将给予他们一个authorization_code,然后他们可以把这个authorization_code交给我的服务器。然后我的服务器可以用这个代码交换一个access_token。因此检索关于用户的信息。然后我就可以保证用户就是他们所说的那个人。
谷歌文档(上面的链接)说:“在Authorized redirect URI字段中,删除默认值。它不用于这种情况。",但是,对于我的服务器来说,要将authorization_code交换为access_token,它需要提供redirect_uri,我是否遗漏了什么?
例如,X11 M1 N1 X对Unity游戏毫无用处(因为用谷歌登录只是打开一个新的“窗口”,该窗口在登录时关闭,不涉及重定向)。
TL;DR如何使用OAuth2在客户端和服务器之间对用户进行身份验证而不进行重定向?

4urapxun

4urapxun1#

TL;DR如何使用OAuth2在客户端和服务器之间对用户进行身份验证,而无需重定向?

OAuth要求将用户定向到授权(可能还有登录)屏幕,然后重定向回您的应用。

编辑日期:2022年12月20日。请参阅下面有关最新状态的注解

g6ll5ycj

g6ll5ycj2#

您看过此文档了吗?https://developers.google.com/accounts/docs/OAuth2InstalledApp#choosingredirecturi

选择重定向URI

当您在Google开发人员控制台中创建客户端ID时,会为您创建两个redirect_uri:urn:ietf:wg:oauth:2.0:oobhttp://localhost。应用程序使用的值确定如何将授权码返回到应用程序。
http://localhost

**此值通知Google授权服务器,授权码应作为查询字符串参数返回到客户端上的Web服务器。**您可以指定端口号,而无需更改Google开发人员控制台配置。要使用此URL接收授权码,您的应用程序必须侦听本地Web服务器。这在许多(但不是全部)服务器上是可能的。平台。如果您的平台支持它,则这是获取授权码的推荐机制。

eqqqjvef

eqqqjvef3#

我遇到了这个问题,我花了很长时间才找到Nepoxx在这里接受答案的评论中提到的“postmessage”解决方案。
为了澄清,以下是对我有效的方法。
1.按照此处的步骤1-6操作:https://developers.google.com/identity/sign-in/web/server-side-flow
1.安装googleapis库npm install --save googleapis
1.对于服务器端令牌交换,请执行以下操作:

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.
    });
iibxawm4

iibxawm44#

redirect_uri可以是客户端为其注册了处理程序的具有自定义URL方案的URL。它与其说是关于“重定向”,不如说是关于应用的回调端点。

92vpleto

92vpleto5#

如果您将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
}

相关问题