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

iOS上的Google OAuth 2隐式流,手动刷新令牌,ios,oauth,google-api,refresh,token,Ios,Oauth,Google Api,Refresh,Token,您好,我有Google OAuth 2显式流,根据: 我还使用GIDSignIn在iOS上运行隐式流,具体地说,我获得了GIDSignInDelegate::sign(\uSignin:GIDSignIn!、didsignin-user:GIDGoogleUser!、withError-error:error!)回调,并可以访问user.authentication.accessToken和user.authentication.refreshtToken 我正试图将refreshttoken

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

我还使用GIDSignIn在iOS上运行隐式流,具体地说,我获得了
GIDSignInDelegate::sign(\uSignin:GIDSignIn!、didsignin-user:GIDGoogleUser!、withError-error:error!)
回调,并可以访问
user.authentication.accessToken
user.authentication.refreshtToken

我正试图将
refreshttoken
传递回我们的私有应用服务器,以便它能够代表用户发出请求(主要是因为使用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'
它返回:

{“错误”:“无效的授权”,“错误描述”:“错误的请求”}

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

我已经在以下位置查看了“API密钥”和“OAuth 2.0客户端ID”部分:

但是我不知所措

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

还是这根本不可能


谢谢

对于任何读到这篇文章的人,我让它工作起来:

一时兴起,我尝试调用刷新令牌端点,但没有传递
client\u 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'
这似乎没有记录在案。我找到的最接近的例子是在,但它显示了
client\u secret=your\u client\u secret&
,并且从来没有提到在隐式流中,前端web和移动应用程序通常不使用客户端机密

请不要高估我的答案,因为我什么都没做。OAuth通常没有很好的文档记录,或者包含与没有底层URL请求或curl示例的平台SDK相关的代码片段。SDK通常是不透明/封闭源代码的,因此需要访问tcpdump或数据包嗅探来查看发生了什么。我没有尽职调查,只是运气好而已

我已经向谷歌发送了反馈,但是如果这个问题影响了你,你可以点击Gmail中的gear并“发送反馈”,希望能更快地更新文档。

请参考此链接:

根据参考,您必须执行以下2个步骤,以便服务器能够刷新您的访问令牌

  • 确保您的服务器和iOS应用程序使用相同项目的凭据、1个浏览器密钥和1个iOS密钥
  • 添加此行:
    [GIDSignIn sharedInstance].serverClientID=您的\u服务器\u客户端\u id