【问题标题】:Issue with invalid_grant error with Google Oauth2Google Oauth2 的 invalid_grant 错误问题
【发布时间】:2021-06-15 16:35:01
【问题描述】:

大家好, 我们一直在深入阅读有关从 google 交换 access_token 的 google 文档,以便将我们的(delphi)桌面应用程序从服务器端与 google 进行 SSO。这是我们首先发送的有效载荷:

https://accounts.google.com/o/oauth2/v2/auth?client_id=1000217514248-t1lojs6f8ed7l9ocrpbm98leahtum8n1.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&state=E1DF2FBA-0A66-4D69-B594-5EB8F7828AF7&scope=openid+profile&include_granted_scopes=true&code_challenge=C832DA50-E55A-499D-89B8-493BB4123C94&login_hint=test@Speelkriebel.be

通常在此之后它会重定向我登录到我们的测试用户,然后根据文档我们向端点令牌发送 POST 请求以获取 access_token 和 refresh_token...:'https:// oauth2.googleapis.com/token 使用以下参数,生成“代码”,我们也将其发送如下:

client_id=1000217514248-t1lojs6f8ed7l9ocrpbm98leahtum8n1.apps.googleusercontent.com
grant_type=authorization_code 
 client_secret=******
code= 4/1AY0e-g4GlavO38PI5Oo3vq04Pc4lMWN77et-02UiVWOsT-IyRQnU1lq19qo
redirect_uri = urn:ietf:wg:oauth:2.0:oob

响应总是

{
  "error_description": "Missing code verifier.", 
  "error": "invalid_grant"
}

我们也尝试发送客户端的秘密 ID,这与我们的 code_challenge 有关系吗?端点 url 和初始 url 好吗?我们缺少什么?我们使用 CEF4Delphi 作为“类似浏览器的体验,以便用户输入他们的谷歌凭据。我们一直在阅读:https://developers.google.com/identity/protocols/oauth2/web-server#offline 我们也在尝试游乐场:https://developers.google.com/oauthplayground/ 我们在生成“代码”的 chrome 中发送初始 url,在 Playground 中我们插入了代码,但仍然出现缺少代码验证器的相同错误。

谢谢大家

【问题讨论】:

    标签: delphi oauth-2.0 google-api google-oauth cef4delphi


    【解决方案1】:

    对于已安装的应用程序,代码质询和验证器是通过 PKCE [1] 增强 OAuth 流程安全性的参数。

    这里有关于生成代码质询和验证器的其他文档 [2]。

    [1]https://www.rfc-editor.org/rfc/rfc7636

    [2]https://developers.google.com/identity/protocols/oauth2/native-app#step1-code-verifier

    【讨论】:

      【解决方案2】:

      您需要对很多值进行 URL 编码尝试不这样做。在开始添加其他所有内容之前,还可以尝试使用基本调用。它应该可以帮助您确定您发送的哪些额外参数导致了您的问题。

      https://accounts.google.com/o/oauth2/auth?client_id={clientid}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=profile&response_type=code
      

      还要确保客户端 ID 来自已安装/其他类型的客户端

      这也可能对Google 3 Legged OAuth2 Flow有帮助

      【讨论】:

      • 感谢 DalmTo,关于先发送几个参数的好建议。我将范围更改为googleapis.com/auth/analytics.readonly,现在我得到了一个令牌!但是我应该使用哪个范围?嗯。我们从 gsuite 管理员帐户创建了 OAuth 桌面客户端 ID。谢谢!
      • 这取决于您尝试访问的 api。检查您尝试访问的方法的文档,它将告诉您需要哪个范围才能访问该方法developers.google.com/identity/protocols/oauth2/scopes
      • 如果您在管理目录 api 之后查看此 developers.google.com/admin-sdk/directory/reference/rest/v1/… 向下滚动到授权范围,它会准确告诉您需要授权的范围。
      • 我会检查一下...我使用的范围不返回 id_token 仅 access_token 和刷新令牌。我们需要将 id_token 发回,Thx
      • 是否总是需要client_secret?在什么情况下我可以通过这个参数?
      猜你喜欢
      • 2014-03-24
      • 2016-03-05
      • 1970-01-01
      • 2021-09-11
      • 2014-09-22
      • 2016-09-23
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      相关资源
      最近更新 更多