您好我的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命令?
或者这根本不可能?
谢谢!
答案 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步才能让服务器刷新您的访问令牌
[GIDSignIn sharedInstance].serverClientID = your_server_client_id