Google iOS 上的 OAuth 2 隐式流程,手动刷新令牌
Google OAuth 2 implicit flow on iOS, refresh token manually
您好,我有 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'
它returns:
{ "error": "invalid_grant", "error_description": "Bad Request" }
我认为问题是我的服务器有客户端 ID 和密码,但 iOS 只有客户端 ID。没有iOS客户端id对应的secret(有时称为key),我就没办法在后端刷新token。我希望 Google 能够检测到服务器客户端 ID 和 iOS 客户端 ID 都已注册到同一个应用程序,并让服务器使用其凭据刷新令牌,但这不起作用。
我查看了 "API keys" 和 "OAuth 2.0 client IDs" 部分:
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 请求或 curl 示例。 SDK 通常是 opaque/closed-source,因此需要下降到 tcpdump 或数据包嗅探以查看发生了什么。我没有做尽职调查,我只是运气好。
我已将反馈发送至 Google,但如果此问题对您有影响,您可以单击 Gmail 中的齿轮并 "Send feedback" 希望更快地更新文档。
请参考这个link:
https://developers.google.com/identity/sign-in/ios/offline-access
根据参考,您必须执行以下 2 个步骤才能让您的服务器能够刷新您的访问令牌
- 确保您的服务器和 iOS 应用使用同一项目的凭据、1 个浏览器密钥和 1 个 iOS 密钥
- 添加这一行:
[GIDSignIn sharedInstance].serverClientID = your_server_client_id
您好,我有 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'
它returns:
{ "error": "invalid_grant", "error_description": "Bad Request" }
我认为问题是我的服务器有客户端 ID 和密码,但 iOS 只有客户端 ID。没有iOS客户端id对应的secret(有时称为key),我就没办法在后端刷新token。我希望 Google 能够检测到服务器客户端 ID 和 iOS 客户端 ID 都已注册到同一个应用程序,并让服务器使用其凭据刷新令牌,但这不起作用。
我查看了 "API keys" 和 "OAuth 2.0 client IDs" 部分:
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 请求或 curl 示例。 SDK 通常是 opaque/closed-source,因此需要下降到 tcpdump 或数据包嗅探以查看发生了什么。我没有做尽职调查,我只是运气好。
我已将反馈发送至 Google,但如果此问题对您有影响,您可以单击 Gmail 中的齿轮并 "Send feedback" 希望更快地更新文档。
请参考这个link: https://developers.google.com/identity/sign-in/ios/offline-access
根据参考,您必须执行以下 2 个步骤才能让您的服务器能够刷新您的访问令牌
- 确保您的服务器和 iOS 应用使用同一项目的凭据、1 个浏览器密钥和 1 个 iOS 密钥
- 添加这一行:
[GIDSignIn sharedInstance].serverClientID = your_server_client_id