没有 redirect_uri 的 Oauth2 流
Posted
技术标签:
【中文标题】没有 redirect_uri 的 Oauth2 流【英文标题】:Oauth2 flow without redirect_uri 【发布时间】:2015-02-16 15:01:56 【问题描述】:我正在创建一个与 Node.js 服务器通信的 android/ios 应用程序,并希望使用 Google(和/或 Facebook)和 OAuth2 在我的服务器上安全地识别它们。我查看了以下文档:https://developers.google.com/+/web/signin/server-side-flow
我不需要授权,我只需要身份验证(我只想确保调用我的 Node.js 服务的人就是他们所说的那个人)。为此,如果我理解正确,我必须让用户在客户端使用 Google 登录,这将为他们提供一个授权码,然后他们可以将其提供给我的服务器。然后,我的服务器可以将该代码交换为 access_token,从而检索有关用户的信息。然后我保证用户就是他们所说的那个人。
谷歌文档(上面的链接)说:“在授权重定向 URI 字段中,删除默认值。它不用于这种情况。”但是,对于我的服务器将授权码交换为访问令牌,它 需要提供redirect_uri
,我错过了什么吗?
redirect_uri
对 Unity 游戏毫无用处,例如(因为使用 Google 登录只会打开一个新的“窗口”,登录时会关闭,不涉及重定向)。
TL;DR 你如何使用 OAuth2 在我的客户端和我的服务器之间验证用户而无需重定向?
【问题讨论】:
【参考方案1】:我遇到了这个问题,我花了很长时间才找到 Nepoxx 在此处接受的答案的 cmets 中提到的“postmessage”解决方案。
为了澄清,这对我有用。
-
在此处执行步骤 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.
);
【讨论】:
【参考方案2】:如果您将 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
【讨论】:
【参考方案3】:redirect_uri
可以是具有自定义 URL 方案的 URL,客户端为其注册了处理程序。此处对此进行了描述:What's a redirect URI? how does it apply to iOS app for OAuth2.0?。与其说是“重定向”,不如说是应用程序的回调端点。
【讨论】:
【参考方案4】:TL;DR 如何使用 OAuth2 在我的客户端和我的服务器之间验证用户身份而不进行重定向?
你不能。 OAuth 要求将用户定向到授权(可能还包括登录)屏幕,然后重定向回您的应用。
【讨论】:
我在 Google 的文档中的某处看到他们使用“postmessage”redirect_uri,但我不知道这是否是他们试图规避的问题。 我选择了这个作为答案,但是我想提一下,使用“postmessage”非常适合我的目的,但这不是“正常”OAuth2 的一部分flow,这是谷歌实现的一种解决方法。关于它的文档不多,但我在这里找到了它:developers.google.com/+/web/signin/… @Nepoxx :链接给出了 404【参考方案5】:您查看过此文档吗? 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 授权服务器发出信号,即 授权码应作为查询字符串参数返回 客户端上的网络服务器。您可以指定一个端口号,而无需 更改 Google Developers Console 配置。接收 使用此 URL 的授权代码,您的应用程序必须正在监听 在本地 Web 服务器上。这对许多人来说是可能的,但不是全部, 平台。如果您的平台支持它,这是推荐的 获取授权码的机制。
【讨论】:
我有,但问题是那些是“回调”。这在本机应用程序或统一应用程序中实际上没有意义,因为没有网页,也没有网络服务器。以上是关于没有 redirect_uri 的 Oauth2 流的主要内容,如果未能解决你的问题,请参考以下文章
通过 OAuth 2 连接到 Google“redirect_uri 的参数值无效:缺少权限:”