PHP-GitHub-Api 认证问题

19
我正在尝试使用 php-github-api 库对用户进行身份验证。到目前为止,我已经将用户发送到Github允许我的应用程序访问,并成功获得了一个令牌。现在我不确定该怎么做。以下是我的代码。
我向Github发送用户的URL。
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状态代码和返回的错误。

提前感谢!


提前感谢!

第二个参数应该是密码。文档说它应该被省略,但也许他们的意思是将 ''null 作为密码传递。如果你真的省略了它,那么你实际上省略了方法并将密码设置为 Github\Client::AUTH_HTTP_TOKEN - GolezTrol
2
这不是真的 - 我检查了 authenticate 方法本身,它会检查第二个参数是否为认证类型之一。这样它就知道第二个参数是密码还是认证类型。感谢回复! - David Jones
是的,我有过 - 很多次! - David Jones
你是否按照 GitHub OAuth 文档 中的第二步所述,将临时代码换成访问令牌?我不确定 php-github-api 是否有此方法。 - Kelly Kiernan
目前不支持 - 我认为这就是 authenticate 方法的作用。如果我必须自己请求访问令牌,然后将其传递到 authenticate 方法中,那么 php-github-api 库就缺少了一个非常关键的步骤。 - David Jones
显示剩余3条评论
2个回答

5

感谢大家的建议。看起来您需要将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 方法并将其缓存到某个地方,目前我是在 session 中进行此操作。

$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,但是遇到了一些问题,因此选择了一个更简单的解决方案。


4
问题在于您将用户认证后收到的代码用作$token,而您应该使用它来获取实际的令牌。向https://github.com/login/oauth/access_token发出POST请求,其中包含client_id、client_secret、code(您之前使用的作为令牌的内容)、state和redirect_uri。
您将获得这种格式的响应:access_token=e72e16c7e42f292c6912e7710c838347ae178b4a&scope=user%2Cgist&token_type=bearer 在HttpClient.php文件中有这段代码,可以使获取令牌比使用cURL更容易。
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


是的,完全正确 - 但我如何使用php-github-api库来实现呢?我以为我正在使用的authenticate方法会发送请求以获取访问令牌。如果在开始使用php-github-api库之前必须自己编写CURL请求以获取访问令牌,那似乎有点毫无意义。 - David Jones
我在文档或快速浏览代码中找不到一个。 - Andrew
一样的 - 我猜下一步是调查代码,看看是否有调用访问 _token 路由,如果没有,我将扩展库以处理这个问题。 - David Jones
我真的不认为它在库里。我甚至没有看到你在哪里传递客户端ID和密钥给库,这是获取令牌所必需的,因此它不会在authenticate方法中自动执行。这肯定是一个很好的补充。 - Kelly Kiernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接