谷歌的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.accessTokenuser.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让你的服务器能够刷新您的访问令牌

  1. 确保您的服务器和iOS应用使用1同一项目的资格证书,1个浏览器密钥的iOS键
  2. 加入这一行:[GIDSignIn sharedInstance].serverClientID = your_server_client_id