首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Google API OAuth 2.0 CURL返回“缺少必需的参数: grant_type”

Google API OAuth 2.0 CURL返回“缺少必需的参数: grant_type”
EN

Stack Overflow用户
提问于 2011-11-19 23:12:33
回答 6查看 13.2K关注 0票数 4

我正在尝试为一个web服务器应用程序实现谷歌的OAuth 2.0身份验证。

我可以从Google ok获取代码,但是当我发回这段代码并尝试获取访问令牌时,它总是给我一个错误“必需的参数缺失: grant_type。错误400”,即使grant_type在那里。

另外,如果我指定content-length为0以外的任何值,它还会抛出其他错误。

下面是执行这个curl post的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$url = 'https://accounts.google.com/o/oauth2/token';
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_setopt($ch, CURLOPT_FAILONERROR, false);  
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); 

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/x-www-form-urlencoded',
    'Content-length: 0'
));

curl_setopt($ch, CURLOPT_POSTFIELDS, array( 
    'code='. urlencode($code),
    'client_id=' . urlencode($clientID),
    'client_secret=' . urlencode($clientSecret),
    'redirect_uri=http%3A%2F%2Flocalhost%2Fexperiments%2FnewGALogin.php',
    'grant_type=authorization_code'
)); 
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-11-20 00:50:02

试一试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl_setopt($ch, CURLOPT_POSTFIELDS, array( 
    'code' => $code,
    'client_id' => $clientID,
    'client_secret' => $clientSecret,
    'redirect_uri' => 'http%3A%2F%2Flocalhost%2Fexperiments%2FnewGALogin.php',
    'grant_type' => 'authorization_code'
)); 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl_setopt($ch, CURLOPT_POSTFIELDS,
    'code=' . urlencode($code) . '&' .
    'client_id=' . urlencode($clientID) . '&' .
    'client_secret=' . urlencode($clientSecret) . '&' .
    'redirect_uri=http%3A%2F%2Flocalhost%2Fexperiments%2FnewGALogin.php' . '&' .
    'grant_type=authorization_code'
); 
票数 7
EN

Stack Overflow用户

发布于 2015-04-10 20:20:46

经过研究这个问题,似乎grant_type在数组格式中不被接受。(是的,查询字符串方法可以工作,但是构建起来很麻烦。)

如果您热衷于将POST字段保留在数组中,那么将http_build_query()添加到数组中是可行的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array( 
    'code' => $code,
    'client_id' => $clientID,
    'client_secret' => $clientSecret,
    'redirect_uri' => 'http%3A%2F%2Flocalhost%2Fexperiments%2FnewGALogin.php',
    'grant_type' => 'authorization_code'
))); 
票数 1
EN

Stack Overflow用户

发布于 2016-01-05 21:48:58

我试图在这里提供的原始问题和答案中使用PHP代码,并不断收到来自Google token服务器的关于丢失的"grant_type“的投诉,尽管它肯定是被传入的。原来问题出在CURLOPT_HTTPHEADER不喜欢/不需要“Content-length:0”。希望这个完整的工作代码能让其他人避免同样令人头疼的事情。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// This is what Google's OAUTH server sends to you
$code = $_GET['code'];

// These come from your client_secret.json file
$clientID = "your client id.apps.googleusercontent.com";
$clientSecret = "your client secret";
$redirectURI = "your redirect URI";
$token_uri = 'https://accounts.google.com/o/oauth2/token';


$ch = curl_init($token_uri);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_setopt($ch, CURLOPT_FAILONERROR, false);  
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/x-www-form-urlencoded'
));

// Build the URLEncoded post data
$postFields = http_build_query(array( 
    'client_secret' => $clientSecret,
    'grant_type' => 'authorization_code',
    'redirect_uri' => $redirectURI,
    'client_id' => $clientID,
    'code' => $code
));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); 

$response = curl_exec($ch);

// Save response, especially the "refresh_token"
$pathToAccessToken = "/your/path/to/access_token.json";
file_put_contents($pathToAccessToken, $response);

仅供参考,响应JSON如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "access_token" : "xxxWhateverGibberish", 
  "token_type" : "Bearer", 
  "expires_in" : 3600, 
  "refresh_token" : "yyyMoreGibberish" 
}

之后,我可以使用如下代码成功查询Calendar (我最初的OAuth请求调用的API作用域):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function getClient() {
  $client = new Google_Client();
  $client->setApplicationName(APPLICATION_NAME);
  $client->setScopes(SCOPES);
  $client->setAuthConfigFile(CLIENT_SECRET_PATH);
  $client->setAccessType('offline');

  // Load previously authorized credentials from a file.
  $pathToAccessToken = "/your/path/to/access_token.json";
  $accessToken = file_get_contents($pathToAccessToken);
  $client->setAccessToken($accessToken);

  // Refresh the token if it's expired.
  if ($client->isAccessTokenExpired()) {
    $client->refreshToken($client->getRefreshToken());
    file_put_contents($pathToAccessToken, $client->getAccessToken());
  }

  return $client;
}

$client = getClient();
$service = new Google_Service_Calendar($client);

// Print the next 10 events on the user's calendar.
$calendarId = 'primary';
$optParams = array(
      'maxResults' => 10,
      'orderBy' => 'startTime',
      'singleEvents' => TRUE,
      'timeMin' => date('c'),
);
$results = $service->events->listEvents($calendarId, $optParams);

if (count($results->getItems()) == 0) {
    print "No upcoming events found.\n";
} else {
    print "Upcoming events:\n";
    foreach ($results->getItems() as $event) {
        $start = $event->start->dateTime;
        if (empty($start)) {
          $start = $event->start->date;
        }
        printf("%s (%s)\n", $event->getSummary(), $start);
    }
}       
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8198072

复制
相关文章
使用OAuth 2.0访问谷歌的API
谷歌的API使用的OAuth 2.0协议进行身份验证和授权。谷歌支持常见的OAuth 2.0场景,如那些Web服务器,安装,和客户端应用程序。
拿我格子衫来
2022/01/24
4.5K0
使用OAuth 2.0访问谷歌的API
从0开始构建一个Oauth2Server服务 <18> AccessToken
访问令牌是应用程序用来代表用户发出 API 请求的东西。访问令牌代表特定应用程序访问用户数据的特定部分的授权。
用户1418987
2023/10/16
2520
从0开始构建一个Oauth2Server服务 <18> AccessToken
持续发布 Chrome 插件
Chrome 插件对于 Chrome 浏览器用户来说是必不可少的利器之一。之前我有开发过一款七牛云图床的 Chrome 插件 image-host。后来由于我自己没有自己的域名,所以不太好使用这个插件了。后面,有其他的同学来提交 PR 来维护这一个插件。这样就有一个问题,一旦新的代码发布,就需要自己再重新发布一下插件。虽然发布插件不算特别麻烦,打包成压缩包,上传就可以了,但是对于程序员来说,可以自动做的绝对不要手动做。以下就是通过 CircleCI 来持续发布 Chrome 插件,参考了官方的文章,自己也才了一些坑。
madneal
2019/11/28
8050
Yii2实现QQ互联登录
Yii2中OAuth扩展及QQ互联登录的方法,实例分析了OAuth扩展的相关配置与QQ互联登陆的实现技巧。
botkenni
2019/09/02
1.2K0
OAuth2.0认证解析
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。
FB客服
2020/11/16
4.4K0
OAuth2.0认证解析
OAuth 2.0 的四种方式
上一篇文章介绍了 OAuth 2.0 是一种授权机制,主要用来颁发令牌(token)。本文接着介绍颁发令牌的实务操作。 下面我假定,你已经理解了 OAuth 2.0 的含义和设计思想,否则请先阅读这个系列的上一篇文章。
辉哥
2019/05/17
6000
Github登录使用oAuth 2.0的更改API通知
 On February 18th, 2020 at 03:24 (UTC) your application (********) used an access token **********) as part of a query parameter to access an endpoint through the GitHub API:
KEVINGUO_CN
2020/03/16
1.1K0
【OIDC】基本概念
注意:不是 OAuth2.0 无法完成认证,而是 OAuth2.0 本身的认证过程缺乏统一的标准。
tonglei0429
2022/10/04
1.6K0
OAuth2.0协议详解
更多可以访问:https://tools.ietf.org/html/rfc6749
山行AI
2019/06/28
1.5K0
google支付回调验证(备用)
20150218,挂机的日本服务器出现google支付被刷单现象,虽然目前进行的修补,但是这个问题并没有完全从根源上解决。并且公司以前的GooglePlay支付也有不完善的地方,在SDK端给支付回调发送支付信息后,支付回调程序没有调用Google API进行订单验证。因此Google支付流程需要进行完善。
全栈程序员站长
2022/07/12
3.7K0
google支付回调验证(备用)
从0开始构建一个Oauth2Server服务 <6> 移动和本机应用程序
与单页应用程序一样,移动应用程序也无法维护客户机密。因此,移动应用程序还必须使用不需要客户端密码的 OAuth 流程。当前的最佳做法是将授权流程与 PKCE 一起使用,同时启动外部浏览器,以确保本机应用程序无法修改浏览器窗口或检查内容。
用户1418987
2023/10/16
2080
从0开始构建一个Oauth2Server服务 <6> 移动和本机应用程序
喜大普奔,Gitee最新版本API推出了以gitee作为资源认证服务器的的OAuth2认证
本文来源:https://gitee.com/api/v5/oauth_doc#/
用户3587585
2022/09/21
1.7K0
喜大普奔,Gitee最新版本API推出了以gitee作为资源认证服务器的的OAuth2认证
腾讯云API网关的OAuth 2.0集成
API网关是腾讯云上流量治理的产品,一般起到承载流量入口的能力。它提供 API 托管服务,能提供 API 的完整生命周期管理,包括创建、维护、发布、运行、下线等。
Yagr Xu
2021/12/02
2.3K0
手把手教你调用百度人脸识别API
现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。
互扯程序
2018/07/30
19.4K1
手把手教你调用百度人脸识别API
一口气说出 OAuth2.0 的四种授权方式
OAuth 简单理解就是一种授权机制,它是在客户端和资源所有者之间的授权层,用来分离两种不同的角色。在资源所有者同意并向客户端颁发令牌后,客户端携带令牌可以访问资源所有者的资源。
程序员小富
2020/07/13
1.4K0
一口气说出 OAuth2.0 的四种授权方式
PHP调用微博接口实现微博登录的方法示例
在平时项目开发过程中,除了注册本网站账号进行登录之外,还可以调用第三方接口进行登录网站。这里以微博登录为例。微博登录包括身份认证、用户关系以及内容传播。允许用户使用微博帐号登录访问第三方网站,分享内容,同步信息。
子润先生
2021/07/13
5940
一口气说出 OAuth2.0 的四种授权方式
上周我的自研开源项目开始破土动工了,[《开源项目迈出第一步,10 选 1?页面模板成了第一个绊脚石
程序员小富
2020/07/07
8560
一口气说出 OAuth2.0 的四种授权方式
REST API 的安全认证,从 OAuth 2.0 到 JWT 令牌
来源:blog.biezhi.me/2019/01/rest-security-basics.html
芋道源码
2020/09/24
2.9K0
REST API 的安全认证,从 OAuth 2.0 到 JWT 令牌
点击加载更多

相似问题

Google oauth2.0,缺少必需的参数: grant_type

10

Google OAuth2:缺少必需的参数: grant_type

23

Google Analytics API :缺少必需的参数: grant_type

11

Google API OAuth 2.0标题:缺少必需的参数: response_type

23

Google Buzz API -无法解决错误:“缺少必需的参数- grant_type”

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文