谷歌的OAuth 2的iOS隐流,刷新令牌手动
您好我有根据谷歌的OAuth 2明确的流程工作:谷歌的OAuth 2的iOS隐流,刷新令牌手动
https://developers.google.com/identity/protocols/OAuth2WebServer
我也有隐含的流动iOS上正与GIDSignIn,具体我得到GIDSignInDelegate::sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!)
回调,并有权访问user.authentication.accessToken
和user.authentication.refreshToken
。
我试图将refreshToken
传回给我们的私人应用程序服务器,以便它可以代表用户发出请求(主要是因为使用SDK登录比使前端开发人员处理raw 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命令?
或者,这是根本不可能的?
谢谢!
对于任何人读这篇文章,我得到它的工作:
一时心血来潮想拜访刷新令牌端点,而无需经过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相关的代码片段,而没有基础的URL请求或卷曲示例。软件开发工具包通常是不透明/闭源的,因此需要下载到tcpdump或者数据包嗅探来查看发生了什么。我没有做尽职调查,我很幸运。
我已将反馈发送给Google,但如果此问题影响到您,您可以点击Gmail中的设备和“发送反馈”,以便更快速地更新文档。
请参考以下链接: https://developers.google.com/identity/sign-in/ios/offline-access
从引用,你必须做以下2steps让你的服务器能够刷新您的访问令牌
- 确保您的服务器和iOS应用使用1同一项目的资格证书,1个浏览器密钥的iOS键
- 加入这一行:
[GIDSignIn sharedInstance].serverClientID = your_server_client_id