Oauth2流没有redirect_uri

时间:2014-12-17 22:39:50

标签: node.js google-oauth passport.js passport-facebook

我正在创建一个与Node.js服务器通信的Android / iOS应用程序,并希望使用Google(和/或Facebook)和OAuth2在我的服务器上安全地识别它们。我查看了以下文档:https://developers.google.com/+/web/signin/server-side-flow

我不需要授权,我只需要身份验证(我只想确保调用我的Node.js服务的人是他们所说的人)。为实现这一目标,如果我理解正确,我必须让用户在客户端使用Google登录,这将为他们提供一个authorization_code,然后他们可以将其提供给我的服务器。然后,我的服务器可以为access_token交换该代码,从而检索有关用户的信息。然后我保证用户就是他们所说的人。

Google文档(上面的链接)说:&#34;在授权重定向URI字段中,删除默认值。它不适用于这种情况。但是,对于我的服务器交换access_token的authorization_code,需要提供redirect_uri,我错过了什么?< / p>

例如,redirect_uri对于Unity游戏来说是无用的(因为登录Google只会打开一个新的&#34;窗口&#34;,登录时关闭,不涉及重定向)。

TL; DR 如何在没有重定向的情况下使用OAuth2在我的客户端和服务器之间对用户进行身份验证?

5 个答案:

答案 0 :(得分:4)

TL; DR如何在没有重定向的情况下使用OAuth2在我的客户端和服务器之间对用户进行身份验证?

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

答案 1 :(得分:3)

你看过这个文件吗? https://developers.google.com/accounts/docs/OAuth2InstalledApp#choosingredirecturi

  

选择重定向URI

     

在Google Developers Console中创建客户端ID时,有两个   redirect_uris是为您创建的:urn:ietf:wg:oauth:2.0:oob和   http://localhost。应用程序使用的值决定了   授权代码将返回给您的应用程序。

     

http://localhost

     

此值向Google授权服务器发出信号   授权代码应作为查询字符串参数返回   客户端上的Web服务器。您可以指定端口号   更改Google Developers Console配置。收到   使用此URL的授权码,您的应用程序必须正在侦听   在本地Web服务器上。这可能在许多方面,但不是全部,   平台。如果您的平台支持它,建议您这样做   获取授权码的机制。

答案 2 :(得分:1)

redirect_uri可以是具有自定义URL方案的URL,客户端为其注册了处理程序。这在此描述:What's a redirect URI? how does it apply to iOS app for OAuth2.0?。它不是关于&#34;重定向&#34;它是关于你的应用程序的回调端点。

答案 3 :(得分:1)

我遇到了这个问题,我花了很长时间才找到Nepoxx在接受答案的评论中提到的“postmessage”解决方案。

澄清一下,这对我有用。

  1. 请按照此处的步骤1-6进行操作:https://developers.google.com/identity/sign-in/web/server-side-flow
  2. 安装googleapis库npm install --save googleapis
  3. 对于服务器端令牌交换,请执行以下操作:
  4.     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.
        });
    

答案 4 :(得分:0)

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