iOS上的Google OAuth 2隐式流程,手动刷新令牌

Posted

技术标签:

【中文标题】iOS上的Google OAuth 2隐式流程,手动刷新令牌【英文标题】:Google OAuth 2 implicit flow on iOS, refresh token manually 【发布时间】:2017-05-24 10:58:34 【问题描述】:

您好,我的 Google OAuth 2 显式流程根据:

https://developers.google.com/identity/protocols/OAuth2WebServer

我还使用 GIDSignIn 在 ios 上工作的隐式流程,特别是我得到了 GIDSignInDelegate::sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) 回调并可以访问 user.authentication.accessTokenuser.authentication.refreshToken

我正在尝试将 refreshToken 传递回我们的私有应用服务器,以便它可以代表用户发出请求(主要是因为使用 SDK 登录比让前端开发人员处理更容易原始 URL 请求)。

但是,当我尝试使用该刷新令牌在后端获取新的访问令牌时:

curl --request POST \
  --url https://www.googleapis.com/oauth2/v4/token \
  --header 'cache-control: no-cache' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data 'client_id=client_id&client_secret=client_secret&refresh_token=refresh_token&grant_type=refresh_token'

返回:

"error": "invalid_grant", "error_description": "Bad Request"

我认为问题在于我的服务器有一个客户端 ID 和密码,但 iOS 只有一个客户端 ID。如果没有与 iOS 客户端 ID 对应的密钥(有时称为密钥),我无法在后端刷新令牌。我希望 Google 会检测到服务器客户端 ID 和 iOS 客户端 ID 都注册到同一个应用程序,并让服务器使用其凭据刷新令牌,但这不起作用。

我查看了“API 密钥”和“OAuth 2.0 客户端 ID”部分:

https://console.developers.google.com/apis/credentials

但我不知所措。

有人知道用于刷新通过 iOS SDK 获取的令牌的 curl 命令吗?

或者这根本不可能?

谢谢!

【问题讨论】:

【参考方案1】:

请参考此链接: https://developers.google.com/identity/sign-in/ios/offline-access

从参考资料中,您必须执行以下 2 个步骤才能让您的服务器能够刷新您的访问令牌

    确保您的服务器和 iOS 应用使用同一项目的凭据,1 个浏览器密钥和 1 个 iOS 密钥 添加此行:[GIDSignIn sharedInstance].serverClientID = your_server_client_id

【讨论】:

【参考方案2】:

对于阅读本文的任何人,我都可以正常工作:

一时兴起,我尝试在不传递client_secret 的情况下调用刷新令牌端点(因为在移动设备上使用隐式流时没有)。这是卷曲:

curl --request POST \
  --url https://www.googleapis.com/oauth2/v4/token \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data 'client_id=client_id&refresh_token=refresh_token&grant_type=refresh_token'

这似乎没有记录。我在https://developers.google.com/identity/protocols/OAuth2InstalledApp#refresh 找到了最接近的示例,但它显示client_secret=your_client_secret&,并且从未提及使用隐式流,前端Web 和移动应用程序通常不使用客户端密码。

请不要赞成我的回答,因为我什么都没做。 OAuth 通常没有很好的文档记录,或者包含与平台 SDK 有关的代码 sn-ps 没有底层 URL 请求或 curl 示例。 SDK 通常是不透明/闭源的,因此需要下拉到 tcpdump 或数据包嗅探以查看发生了什么。我没有做尽职调查,我只是运气好。

我已向 Google 发送反馈,但如果此问题影响了您,您可以点击 Gmail 中的齿轮和“发送反馈”以希望更快地更新文档。

【讨论】:

以上是关于iOS上的Google OAuth 2隐式流程,手动刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在不登录的情况下从 Instagram 获取 oauth 2 访问令牌(隐式流程)?

OAuth2 隐式流程 - IFrame 刷新身份

Spring OAuth2 隐式流程 - 身份验证服务器不处理 POST /oauth/authorize 请求

oauth 隐式授权与授权码授权?

Instagram API:范围是不是适用于 OAuth2 隐式身份验证流程?

OAuth 2 中隐式授权类型的目的是啥?