【问题标题】:How to get google oAuth2.0 access token using curl command?如何使用 curl 命令获取 google oAuth2.0 访问令牌?
【发布时间】:2019-08-17 04:30:08
【问题描述】:

我正在试验 google 的 REST api。在这里,我试图从 cURL 命令生成访问令牌,以便在进一步的 REST 请求中使用它。 但我遇到了以下错误。

我试图通过以下 cURL 命令获取访问令牌,但我得到以下错误响应。

curl \
--request POST \
--data "code=4/GQEg70zaxHAuRhhd6A1RB_6LIxwwBV8ak5xRP-nZIBTjuvt4g3fTWyU&client_id=954040553015-bphgid2596t65i91827omteq778cp7gj.apps.googleusercontent.com&client_secret=Sn3giYFFPMCNteKC--938xsP&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code" \
https://accounts.google.com/o/oauth2/token

回复:

{
"error": "invalid_grant",
"error_description": "Bad Request"
}

然后我编辑了如下命令,但它失败了。

curl -d client_id=954040553015-bphgid2596t65i91827omteq778cp7gj.apps.googleusercontent.com -d client_secret=Sn3giYFFPMCNteKC--938xsP -d grant_type=authorization_code -d redirect_uri=urn:ietf:wg:oauth:2.0:oob -d code=4/GQEg70zaxHAuRhhd6A1RB_6LIxwwBV8ak5xRP-nZIBTjuvt4g3fTWyU https://oauth2.googleapis.com/token

回复:

{
  "error": "invalid_grant",
  "error_description": "Bad Request"
}

因此,基于此链接https://gist.github.com/LindaLawton/cff75182aac5fa42930a09f58b63a309#file-googleauthenticationcurl-sh,我更改了 grant_type=client_credentials。但我又得到了错误响应。

{
"error": "unsupported_grant_type",
"error_description": "Invalid grant_type: client_credentials"
}

所以,请帮我解决这个错误。

【问题讨论】:

  • 您从哪里获得code 参数的值?你确定你已经正确地转义了所有元字符吗?将-v 添加到您的 curl 并检查发送的内容是否是您认为发送的内容。转到developers.google.com/oauthplayground 并逐步完成身份验证流程。将 Playground 发送的内容与您发送的内容进行比较。
  • 我从链接中获取了代码,并从网页中复制了代码并添加到 curl 命令中。 accounts.google.com/o/oauth2/… 我在 curl 命令中添加了 -v,但没有帮助。
  • 粘贴curl -v的输出
  • 您好,请在此处找到curl -v 登录drive.google.com/open?id=1qE0AUbX2yqNXz6GyQxYNT_OcS1RnQzXd

标签: android curl oauth-2.0 google-drive-api google-oauth


【解决方案1】:

所以答案就在问题中。 "Invalid grant_type: client_credentials" 而授权类型应该是 authorization_code

我对您的建议是去 OAuth 游乐场,比较它发送的内容与您发送的内容。这是操场上的粘贴...

POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-length: 277
content-type: application/x-www-form-urlencoded
user-agent: google-oauth-playground
code=4%2FGgFtOcUM73dTMJNpE7XR7w082MrYH-LCm7zMylg31ESKrwmpyQXnzOM
 &redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground
 &client_id=407408718192.apps.googleusercontent.com
 &client_secret=************
 &scope=
 &grant_type=authorization_code

【讨论】:

    【解决方案2】:

    不要使用urn:ietf:wg:oauth:2.0:oob

    也不使用https://developers.google.com/oauthplayground

    但使用http://localhost ...

    或任何网络服务器,它将回发重写为本地主机名。

    除非处理该回发,否则 cURL 请求本身是无用的。

    虽然这个问题甚至没有透露这是在线还是在 NAT 之后。

    对于服务器到服务器的 oAuth2 流程,您需要一个在线主机和服务帐户的凭据。

    【讨论】:

    • 其实我是通过shell脚本做实验的,所以没机会在google的oAuth Playground中使用。另外,我还没有在本地配置任何网络服务器。
    • @KIRUBAKARANS 没有这个,你可能会不走运,因为回发将会丢失。它的工作原理是这样的(这也计入由 shell 脚本启动的 oAuth2 流):oauth.com/oauth2-servers/server-side-apps ...自定义本地主机名或端口需要在线 Web 服务器,否则它将无法解析 DNS。
    猜你喜欢
    • 2019-02-14
    • 1970-01-01
    • 2014-11-06
    • 2021-12-17
    • 2016-09-12
    • 1970-01-01
    • 2015-02-22
    • 2013-06-24
    • 2014-02-10
    相关资源
    最近更新 更多