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.accessToken
和 user.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 访问令牌(隐式流程)?
Spring OAuth2 隐式流程 - 身份验证服务器不处理 POST /oauth/authorize 请求