PHP-GitHub-Api 身份验证问题
PHP-GitHub-Api Authentication Issue
我正在尝试使用 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 状态代码和 return.
中的错误
提前致谢!
问题是您使用的是用户验证为 $token
后收到的代码,而您本应使用它来获取实际令牌。使用 client_id、client_secret、代码(您用作令牌的内容)、状态和 redirect_uri 向 https://github.com/login/oauth/access_token
发出 post 请求。
您将收到此格式的回复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
感谢大家的建议。似乎您必须将 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());
}
好了。
我确实尝试使用 php github api 库的 HttpClient,但我遇到了一些问题,所以选择了一个更简单的解决方案。
我正在尝试使用 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 状态代码和 return.
中的错误提前致谢!
问题是您使用的是用户验证为 $token
后收到的代码,而您本应使用它来获取实际令牌。使用 client_id、client_secret、代码(您用作令牌的内容)、状态和 redirect_uri 向 https://github.com/login/oauth/access_token
发出 post 请求。
您将收到此格式的回复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
感谢大家的建议。似乎您必须将 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());
}
好了。
我确实尝试使用 php github api 库的 HttpClient,但我遇到了一些问题,所以选择了一个更简单的解决方案。