Подтвердить что ты не робот

Проблема аутентификации PHP-GitHub-Api

Я пытаюсь аутентифицировать пользователя, используя библиотеку php-github-api. Пока я отправил пользователя в Github, чтобы разрешить доступ к моему приложению, и я успешно получаю токен. Я не уверен, что делать сейчас. Вот мой код.

URL-адрес, по которому я отправляю пользователя в Github с.

https://github.com/login/oauth/authorize?scope=repo,user&client_id=<client_id>

Тогда с php-github-api я делаю это. Переменная $token - это код, который отправляется в массиве $_GET, когда пользователь перенаправляется на обратный вызов.

        $client = new \Github\Client();
        try {
            $auth = $client->authenticate($token, Github\Client::AUTH_HTTP_TOKEN);
        } catch (Exception $e) {
            dp($e);
        }

Кто-нибудь знает, является ли это правильным методом аутентификации пользователя? Когда я пытаюсь вызвать метод, для которого требуется аутентифицированный пользователь, я получаю код состояния 401 и ошибку в ответ.

Спасибо заранее!

4b9b3361

Ответ 1

Спасибо всем за их предложения. Похоже, что вам нужно кормить access_token в методе проверки подлинности, поэтому простым исправлением, которое я выполнил, был запрос CURL, чтобы захватить access_token, а затем добавить его к методу проверки подлинности в обратном вызове.

        $token  = $_POST['token'];
        $params = [
            'client_id'     => self::$_clientID,
            'client_secret' => self::$_clientSecret,
            'redirect_uri'  => 'url goes here',
            'code'          => $token,
        ];

    try {
        $ch = curl_init('https://github.com/login/oauth/access_token');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
        $headers[] = 'Accept: application/json';

        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        $response = curl_exec($ch);
    } catch (\Exception $e) {
        dp($e->getMessage());
    }

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

$client = self::getClient();
    $_SESSION['access_token'] = $response->access_token;

    try {
        $client->authenticate($response->access_token, Github\Client::AUTH_HTTP_TOKEN);
    } catch (\Exception $e) {
        dp($e->getMessage());
    }

Итак, у нас это есть.

Я попытался использовать HttpClient библиотеки php github api, но у меня были некоторые проблемы, поэтому выбрал более простое решение.

Ответ 2

Проблема в том, что вы используете код, который вы получаете после того, как пользователь аутентифицируется как $token, когда вы должны использовать его для получения фактического токена. Сделайте запрос на отправку https://github.com/login/oauth/access_token с помощью client_id, client_secret, кода (то, что вы использовали как токен), состояния и redirect_uri.

Вы получите ответ в этом формате access_token=e72e16c7e42f292c6912e7710c838347ae178b4a&scope=user%2Cgist&token_type=bearer

В файле HttpClient.php есть этот код, который облегчит получение токена, чем cURLing

public function post($path, $body = null, array $headers = array())
{
    return $this->request($path, $body, 'POST', $headers);
}

https://developer.github.com/v3/oauth/#github-redirects-back-to-your-site