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

时间:2017-01-10 03:20:56

标签: ios oauth google-api refresh token

您好我的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命令?

或者这根本不可能?

谢谢!

2 个答案:

答案 0 :(得分:1)

对于阅读此内容的任何人,我都明白了:

我一时兴起尝试调用刷新令牌端点而不传递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'

这似乎没有记录。我找到的最接近的示例是doc,但它显示client_secret=your_client_secret&,并且从未提到过隐式流,前端网络和移动应用通常不会使用客户端密钥。

请不要回答我的回答,因为我没有做任何事情。 OAuth通常没有很好地记录,或者包含与没有底层URL请求或curl示例的平台SDK相关的代码片段。 SDK通常是不透明/封闭源的,因此需要下载到tcpdump或数据包嗅探以查看正在发生的事情。我没有做尽职调查,我很幸运。

我已向Google发送反馈,但如果此问题对您有影响,您可以点击Gmail中的设备和“发送反馈”,以便更快地更新文档。

答案 1 :(得分:0)

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

从参考文献中,您必须执行以下2步才能让服务器刷新您的访问令牌

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