2015-07-23 3 views
19

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

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 и ошибку в ответ.

Заранее благодарен!

+0

[Второй аргумент] (https://github.com/KnpLabs/php-github-api/blob/master/doc/security.md) должен быть паролем. Документы говорят, что это должно быть «пропущено», но, возможно, они означают «' '' '' или 'null' для пароля. Если вы на самом деле опускаете это, вы фактически опускаете * метод * и устанавливаете пароль для 'Github \ Client :: AUTH_HTTP_TOKEN'. – GolezTrol

+2

Это неверно. Я проверил сам метод аутентификации и проверяет, являются ли второй параметры одним из типов проверки подлинности. Таким образом, он знает, является ли второй параметр паролем или типом аутентификации. Спасибо за ответ! –

+0

, и вы уверены, что $ client является экземпляром 'Github \ Client'? Если это экземпляр 'Github \ HttpClient \ HttpClient', ответ GolezTrol прав. –

ответ

5

Спасибо всем за их предложения. Похоже, вы должны пропустить 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, но у меня были некоторые проблемы, поэтому я выбрал более простое решение.

4

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

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

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

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

+0

Да, это точно, но как это сделать, используя библиотеку php-github-api? Я был в предположении, что метод аутентификации, который я использую, отправит запрос, чтобы получить токен доступа. Кажется немного бессмысленным, если я должен сам написать запрос CURL, чтобы получить токен доступа, прежде чем я смогу начать использовать библиотеку php-github-api. –

+0

Я не могу найти его в документах или быстро проверять код. – Andrew

+0

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

Смежные вопросы