PHP.Как получить токен доступа.Аутентификация с помощью OAuth 2.0 для Google API - PullRequest
2 голосов
/ 18 января 2012

Я нашел эту функцию , которая предположительно получает accessToken, но я ничего не получаю.У меня есть $_REQUEST['code'] и другая информация, необходимая для этой функции.

Есть идеи, что здесь не так?Спасибо.

//Oauth 2.0: exchange token for session token so multiple calls can be made to api
if(isset($_REQUEST['code'])){
    $_SESSION['accessToken'] = get_oauth2_token($_REQUEST['code']);
}

//returns session token for calls to API using oauth 2.0
function get_oauth2_token($code) {
    global $client_id;
    global $client_secret;
    global $redirect_uri;

    $oauth2token_url = "https://accounts.google.com/o/oauth2/token";
    $clienttoken_post = array(
    "code" => $code,
    "client_id" => $client_id,
    "client_secret" => $client_secret,
    "redirect_uri" => $redirect_uri,
    "grant_type" => "authorization_code"
    );

    $curl = curl_init($oauth2token_url);

    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $clienttoken_post);
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $json_response = curl_exec($curl);
    curl_close($curl);

    $authObj = json_decode($json_response);

    if (isset($authObj->refresh_token)){
        //refresh token only granted on first authorization for offline access
        //save to db for future use (db saving not included in example)
        global $refreshToken;
        $refreshToken = $authObj->refresh_token;
    }

    $accessToken = $authObj->access_token;
    return $accessToken;
}

Ответы [ 5 ]

4 голосов
/ 03 июня 2014

Это то, что я сделал, чтобы получить токен доступа и обновить токен.

Создайте файл, содержащий следующий код:

<?php

if (isset($_GET['code'])) {
    // try to get an access token
    $code = $_GET['code'];
    $url = 'https://accounts.google.com/o/oauth2/token';
    $params = array(
        "code" => $code,
        "client_id" => YOUR_CLIENT_ID,
        "client_secret" => YOUR_CLIENT_SECRET,
        "redirect_uri" => 'http://' . $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"],
        "grant_type" => "authorization_code"
    );

    $ch = curl_init();
    curl_setopt($ch, constant("CURLOPT_" . 'URL'), $url);
    curl_setopt($ch, constant("CURLOPT_" . 'POST'), true);
    curl_setopt($ch, constant("CURLOPT_" . 'POSTFIELDS'), $params);
    $output = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);
    if ($info['http_code'] === 200) {
        header('Content-Type: ' . $info['content_type']);
        return $output;
    } else {
        return 'An error happened';
    }
} else {

    $url = "https://accounts.google.com/o/oauth2/auth";

    $params = array(
        "response_type" => "code",
        "client_id" => YOUR_CLIENT_ID,
        "redirect_uri" => 'http://' . $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"],
        "scope" => "https://www.googleapis.com/auth/plus.me"
    );

    $request_to = $url . '?' . http_build_query($params);

    header("Location: " . $request_to);
}

Теперь замените YOUR_CLIENT_ID и YOUR_CLIENT_SECRET на свой идентификатор клиента и секрет клиента.

Убедитесь, что ваш объем правильный. Например, это должно быть https://www.googleapis.com/auth/analytics, если вы хотите получить доступ к Google Analytics.

Если вы запустите файл, вы должны получить экран подтверждения OAuth2.

Если вы сейчас нажмете Accept, вы должны получить результат, который выглядит следующим образом:

{
  "access_token" : YOUR_ACCESS_TOKEN,
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : YOUR_REFRESH_TOKEN
}

Результат может содержать дополнительные поля, в зависимости от того, на какую область вы претендуете.

1 голос
/ 08 сентября 2013

этот код выглядит знакомым - я использую примерно один и тот же код - есть две вещи, которые вы можете попробовать.

  1. Используйте echo для вывода ответа в браузер

    echo $ json_response;

  2. Получите Fiddler и используйте следующую строку перед вызовом curl_exec

    curl_setopt ($ curl, CURLOPT_PROXY, '127.0.0.1:8888');

'fraid У меня тоже не получается - ответ я получаю

{ 
     "error" : "invalid_request" 
}

Теперь, если кто-нибудь знает, что с этим не так;)

1 голос
/ 18 января 2012

Я не вижу ничего плохого в вашем коде, но вы можете попробовать обновить секрет клиента и посмотреть, поможет ли это. Кроме того, я бы посоветовал вам точно узнать, что ответ приходит от вашей команды curl, я подозреваю, что это «invalid_grant».

Гораздо лучший способ сделать это - использовать клиент php api от Google:

https://code.google.com/p/google-api-php-client/

, который обрабатывает большую часть общения для вас. Примеры там очень просты в использовании. В основном это зависит от того, к какому сервису Google вы пытаетесь обратиться.

0 голосов
/ 09 декабря 2013

У меня была та же ошибка, и я обнаружил, что добавление

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);

, чтобы позволить запросу следовать за перенаправлением, решило это быстро.Я надеюсь, что это помогает кому-то еще!

0 голосов
/ 16 октября 2013

Из раздела 4.4.2 «Протокола авторизации OAuth 2.0 draft-ietf-oauth-v2-20»

Клиент делает запрос к конечной точке токена, добавляя следующие параметры, используяФормат «application / x-www-form-urlencoded» в теле сущности HTTP-запроса:

Поэтому параметры POST должны быть представлены в виде строки, а не массива.Это также упоминается в руководстве по PHP для curl_setopt.

Так что вместо публикации $ clienttoken_post вы можете публиковать http_build_query ($ clienttoken_post, '', '&').

Это можетне решить все ваши проблемы, но, вероятно, это шаг в правильном направлении.

...