Я пытаюсь аутентифицировать пользователя, используя PHP-GitHub-апи библиотека. До сих пор я отправлял пользователя на 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 и ошибку в ответ.
Заранее спасибо!
Спасибо всем за их предложения. Похоже, что вы должны передать access_token в метод authenticate, поэтому я легко выполнил исправление CURL-запроса, чтобы получить access_token и добавить его в метод authenticate в обратном вызове.
$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());
}
Затем при обратном вызове мы можем вызвать метод authenticate и кэшировать его где-нибудь, в настоящее время я делаю это в сеансе.
$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, но у меня были некоторые проблемы, поэтому я выбрал более простое решение.
Проблема в том, что вы используете код, который вы получаете после того, как пользователь аутентифицируется как $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