<i id='coIA0'><tr id='coIA0'><dt id='coIA0'><q id='coIA0'><span id='coIA0'><b id='coIA0'><form id='coIA0'><ins id='coIA0'></ins><ul id='coIA0'></ul><sub id='coIA0'></sub></form><legend id='coIA0'></legend><bdo id='coIA0'><pre id='coIA0'><center id='coIA0'></center></pre></bdo></b><th id='coIA0'></th></span></q></dt></tr></i><div id='coIA0'><tfoot id='coIA0'></tfoot><dl id='coIA0'><fieldset id='coIA0'></fieldset></dl></div>
  • <small id='coIA0'></small><noframes id='coIA0'>

    <legend id='coIA0'><style id='coIA0'><dir id='coIA0'><q id='coIA0'></q></dir></style></legend>

  • <tfoot id='coIA0'></tfoot>
      • <bdo id='coIA0'></bdo><ul id='coIA0'></ul>

        php 中使用 curl 的 OAuth 2.0

        时间:2023-05-31

          <tbody id='I73rR'></tbody>
          <bdo id='I73rR'></bdo><ul id='I73rR'></ul>
          <i id='I73rR'><tr id='I73rR'><dt id='I73rR'><q id='I73rR'><span id='I73rR'><b id='I73rR'><form id='I73rR'><ins id='I73rR'></ins><ul id='I73rR'></ul><sub id='I73rR'></sub></form><legend id='I73rR'></legend><bdo id='I73rR'><pre id='I73rR'><center id='I73rR'></center></pre></bdo></b><th id='I73rR'></th></span></q></dt></tr></i><div id='I73rR'><tfoot id='I73rR'></tfoot><dl id='I73rR'><fieldset id='I73rR'></fieldset></dl></div>

        • <small id='I73rR'></small><noframes id='I73rR'>

            <tfoot id='I73rR'></tfoot><legend id='I73rR'><style id='I73rR'><dir id='I73rR'><q id='I73rR'></q></dir></style></legend>
                • 本文介绍了php 中使用 curl 的 OAuth 2.0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我需要获取用于 OAuth 2.0 的 access_token 和 refresh_token 才能访问 Google API,下面的 php 脚本应该返回一个带有 access_token、refresh_token 的 json,如下所示:

                  I need to get my access_token and refresh_token for OAuth 2.0 to Access Google APIs, the php script below should return a json with access_token, refresh_token like this:

                  {
                    "access_token" : "####",
                    "token_type" : "Bearer",
                    "expires_in" : 3600,
                    "refresh_token" : "####"
                  }
                  

                  但是,php 脚本只返回这个错误信息:

                  but, the php script return me only this error message:

                  {
                  "error" : "invalid_request",
                  "error_description" : "Client must specify either client_id or client_assertion, not both"
                  }
                  

                  我尝试删除 client_secret/client_id 并仅使用 client_id/client_secret,但仍然出现相同的错误.

                  I tried to remove client_secret/client_id and use only client_id/client_secret, but still get the same error.

                  $client_id = '###.apps.googleusercontent.com';
                  $redirect_uri = 'http://localhost/phpConnectToDB/csv/refreshFusionTable.php';
                  $client_secret = '###';
                  
                  $ch = curl_init();
                  
                  curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/o/oauth2/token");
                  
                  $code = $_REQUEST['code'];
                  
                  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
                  
                  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                  
                  
                  curl_setopt($ch, CURLOPT_POSTFIELDS, array(
                  'code' => $code,
                  'client_id' => $clientID,
                  'client_secret' => $clientSecret,
                  'redirect_uri' => $redirect_uri,
                  'grant_type' => 'authorization_code'
                  ));
                  
                  $data = curl_exec($ch);
                  
                  var_dump($data);
                  

                  尽管 cmd 中的 curl 可以正常工作并返回我的访问权限和刷新令牌而没有任何错误.

                  Although curl in cmd works and returns me access and refresh token without any errors.

                  curl --data "code=###&client_id=###.apps.googleusercontent.com&client_secret=###&redirect_uri=http://localhost/phpConnectToDB/csv/refreshFusionTable.php&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token
                  

                  我不明白为什么会出现缺少的方案错误,尽管 .php 脚本存在并且它位于给定的路径上.你能帮我吗?

                  I don't understand why I get the missing scheme error, although the .php script exists and it's located on the given path. Could you help me please ?

                  EDIT

                  解决了redirect_uri 的参数值无效:缺少方案"的问题,我只是用这个 'redirect_uri' => $redirect_uri 替换了 'redirect_uri' => urlencode($redirect_uri),在CURLOPT_POSTFIELDS.

                  EDIT

                  Problem with "Invalid parameter value for redirect_uri: Missing scheme" solved, I just replaced 'redirect_uri' => urlencode($redirect_uri), with this 'redirect_uri' => $redirect_uri, in CURLOPT_POSTFIELDS.

                  推荐答案

                  哇,愚蠢的错误,我应该休息一下.

                  Wow, stupid mistake, I should have a rest.

                  变量名称不匹配.我定义:

                  The variables names don't match. I defined:

                      $client_id = '###.apps.googleusercontent.com';
                      $client_secret = '###';
                  

                  但是这里我使用了一个不存在的 clientID 和 clientSecret :

                  But here I used an non-existing clientID and clientSecret :

                      curl_setopt($ch, CURLOPT_POSTFIELDS, array(
                      'code' => $code,
                      'client_id' => $clientID,
                      'client_secret' => $clientSecret,
                      'redirect_uri' => $redirect_uri,
                      'grant_type' => 'authorization_code'
                      ));
                  

                  固定和工作的 PHP 脚本

                      $client_id = '###.apps.googleusercontent.com';
                      $redirect_uri = 'http://localhost/phpConnectToDB/csv/refreshFusionTable.php';
                      $client_secret = '###';
                  
                      $ch = curl_init();
                      
                      curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/o/oauth2/token");
                      
                      curl_setopt($ch, CURLOPT_POST, TRUE);
                      
                      $code = $_REQUEST['code'];
                  
                      // This option is set to TRUE so that the response
                      // doesnot get printed and is stored directly in
                      // the variable
                      curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
                      
                      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                      
                      curl_setopt($ch, CURLOPT_POSTFIELDS, array(
                      'code' => $code,
                      'client_id' => $client_id,
                      'client_secret' => $client_secret,
                      'redirect_uri' => $redirect_uri,
                      'grant_type' => 'authorization_code'
                      ));
                  
                      $data = curl_exec($ch);
                      
                      var_dump($data);
                  

                  但是我不得不说google在这里提供了一个有点误导性的错误信息,因为我没有定义client_id和client_secret,错误信息是:

                  But I have to say that google provides a little misleading error message here, because I hadn't defined client_id nor client_secret and the error message was:

                      {
                      "error" : "invalid_request",
                      "error_description" : "Client must specify either client_id or client_assertion, not both"
                      }
                  

                  这篇关于php 中使用 curl 的 OAuth 2.0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:使用 YoutubeApi v3 和 ouath2 在没有用户身份验证的情况下将视频上传到我的 Youtube 频道 下一篇:使用 Laravel 5.4 和 Passport 进行多重身份验证

                  相关文章

                    <bdo id='FF4Cr'></bdo><ul id='FF4Cr'></ul>
                • <legend id='FF4Cr'><style id='FF4Cr'><dir id='FF4Cr'><q id='FF4Cr'></q></dir></style></legend>
                    <tfoot id='FF4Cr'></tfoot>

                    1. <i id='FF4Cr'><tr id='FF4Cr'><dt id='FF4Cr'><q id='FF4Cr'><span id='FF4Cr'><b id='FF4Cr'><form id='FF4Cr'><ins id='FF4Cr'></ins><ul id='FF4Cr'></ul><sub id='FF4Cr'></sub></form><legend id='FF4Cr'></legend><bdo id='FF4Cr'><pre id='FF4Cr'><center id='FF4Cr'></center></pre></bdo></b><th id='FF4Cr'></th></span></q></dt></tr></i><div id='FF4Cr'><tfoot id='FF4Cr'></tfoot><dl id='FF4Cr'><fieldset id='FF4Cr'></fieldset></dl></div>

                      <small id='FF4Cr'></small><noframes id='FF4Cr'>