Аутентификация в Google Auth с PHP cURL вызывает непрерывную пересылку - PullRequest
0 голосов
/ 22 января 2020

Я хочу получить токен аутентификации из Google OAuth 2.0 (я использовал этот учебник). Однако, когда я хочу аутентифицироваться, это приводит к бесконечному l oop перенаправлению в ничто, таким образом обновления страницы. Без каких-либо сообщений об ошибках. Я не могу понять, что происходит не так.

Это мой PHP код:

<?php

// Admin Google API settings
// Portal url:

require_once('./curl.php');

define("CALLBACK_URL", "http://localhost/losapi/index2.php");  //Callback URL
define("AUTH_URL", "https://accounts.google.com/o/oauth2/v2/auth");   //Used to get CODE (not Token!)
define("CLIENT_ID", "***");  // Personal
define("CLIENT_SECRET", "***");  // Personal
define("SCOPE", "https://www.googleapis.com/auth/admin.directory.device.chromeos https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/admin.directory.orgunit"); // Depends on what you want to do.
define("APIURL_DIRECTORY","https://www.googleapis.com/admin/directory/v1/customer/");  // For Google Directory actions
define("CUSTOMER_ID","***");       // Personal
define("TOKEN_URL","https://oauth2.googleapis.com/token");   // URL to get Token (not code).
$curl = new \CURL\cURL();
// Initiate code for access token
if(isset($_GET["code"])){
  //DEBUG:  echo "Code: ".$_GET["code"];
  $url = TOKEN_URL."?";
  $url .= "code=".$_GET["code"];
  $url .= "&grant_type=authorization_code";
  $url .= "&client_id=". urlencode(CLIENT_ID);
  $url .= "&client_secret=". urlencode(CLIENT_SECRET);
  $url .= "&redirect_uri=". urlencode(CALLBACK_URL);

  $response = json_decode($curl->exeCurl($url,"POST"), true);
  if(isset($response)){
    if(array_key_exists("access_token", $response)) {
      $access_token = $response;
      setcookie("LOStoken", $response['access_token'], time() + (86400 * 30), "/");  // 86400 = 1 day
    }
  }
} else {

  if(isset($_POST['gettoken'])){

    $url = AUTH_URL."?";
    $url .= "response_type=code";
    $url .= "&client_id=". urlencode(CLIENT_ID);
    $url .= "&scope=". urlencode(SCOPE);
    $url .= "&redirect_uri=". urlencode(CALLBACK_URL);
    echo $curl->exeCurl($url,"GET");
  }
}

?>

curl. php

 namespace CURL;


class cURL
  {

// Algeneme cURL functie om web call te doen.
function exeCurl($url,$method,$body="") {
    $curl = curl_init();                      // initiate curl

    // Afhankelijk van TOKEN worden er andere headers gegeven.
    if(isset($_COOKIE["LOStoken"])){
        $headers = array(
            "Accept: */*",
            "Accept-Encoding: gzip, deflate",
            "Authorization: Bearer ". $_COOKIE["LOStoken"],
            "Connection: keep-alive",
            "Content-Length: ". strlen($body),
            "Content-Type: application/json",
            "cache-control: no-cache"
        );
    } else {
        $headers = array(
            "Accept: */*",

            "Cache-Control: no-cache",
            "Content-Length: ". strlen($body),
            "Connection: keep-alive",
            "cache-control: no-cache"
        );
    }

    // Set parameters for curl
    $params = array(
        CURLOPT_URL => $url,                              // API URL
        CURLOPT_RETURNTRANSFER => true,                   // Return answer
        CURLOPT_SSL_VERIFYPEER => false,                  // SSL, enable in production
        //CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,                          // Max redirect
        CURLOPT_FOLLOWLOCATION => true,                   // If 301, follow redirect
        CURLOPT_TIMEOUT => 30,                            // Max timeout
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,    // HTTP version used
        CURLOPT_CUSTOMREQUEST => $method,                 // HTTP method used
        CURLOPT_HTTPHEADER => $headers);                   // HTTP headers

    // Combineer curl + parameters
    curl_setopt_array($curl, $params);

    // Curl antwoorden
    $response = curl_exec($curl);
    $err = curl_error($curl);         // vul met errors
    curl_close($curl);                // Sluit verbinding

    if ($err) {
        echo "cURL Error #:" . $err;    // Als er errors zijn
    }
    if(array_key_exists("error", $response)) echo $response["error_description"];

    return $response;                 // Geef volledige antwoord terug
}


 }

1 Ответ

0 голосов
/ 23 января 2020

Вы пытаетесь получить URL авторизации через cURL - это не может работать, этот процесс авторизации требует взаимодействия с пользователем. Вам нужно перенаправить пользователя на этот URL в их браузере.

Вы можете либо перенаправить пользователя на этот URL автоматически; или вы просто помещаете его в атрибут href ссылки, чтобы пользователь мог щелкнуть по нему, чтобы начать весь процесс. (Я бы рекомендовал второй вариант в целом, но по крайней мере во время разработки. С автоматическим перенаправлением c есть хороший шанс, что вы снова создадите циклическое перенаправление, если что-то пойдет не так.)

...