February 13, 2013

FuelPHPでGitHub認証をするサンプル

結構前に確認してほったらかしていたネタですが、ふと書く気になったので。。。

まず、GitHubのアプリは
https://github.com/settings/applications/new
で登録できます。

アプリを登録すると、Client IDとClient Secretが手に入ります。

PHP用のGitHubライブラリは
http://developer.github.com/v3/libraries/
に記載があるのですが、単に認証にだけ使いたい場合は、以下の方法で可能でした。

コントローラ(classes/controller/github.php)
<?php

class Controller_Github extends Controller
{

    private static $client_id = 'xxxxxxxxxx';
    private static $client_secret = 'yyyyyyyyyy';

    public function action_signin()
    {
        Github::authorize(static::$client_id);
    }

    public function action_callback()
    {
        $code = Input::get('code', false);

        if($code === false)
        {
            throw new Exception('Invalid code.');
        }

        $access_token = Github::get_access_token(static::$client_id, static::$client_secret, $code);

        $user = Github::get_user($access_token['access_token']);

        Debug::dump($user);
        exit();
    }

}
Githubクラス(classes/github.php)
<?php

class Github
{

    const AUTHORIZE_URL = 'https://github.com/login/oauth/authorize';
    const GET_ACCESS_TOKEN_URL = 'https://github.com/login/oauth/access_token';
    const GET_USER_URL = 'https://api.github.com/user';

    public static function authorize($client_id, $params = array())
    {
        $params = array_merge(array('client_id' => $client_id), $params);
        Response::redirect(static::AUTHORIZE_URL.'?'.http_build_query($params));
    }

    public static function get_access_token($client_id, $client_secret, $code, $params = array())
    {
        $params = array_merge(
            array(
                'client_id' => $client_id,
                'client_secret' => $client_secret,
                'code' => $code,
            ),
            $params
        );

        $context = stream_context_create(array('http' => array(
            'method' => 'POST',
            'header'  => 'Content-type: application/x-www-form-urlencoded',
            'content' => http_build_query($params),
        )));

        $access_token = file_get_contents(static::GET_ACCESS_TOKEN_URL, false, $context);
        parse_str($access_token, $access_token);

        return $access_token;
    }

    public static function get_user($access_token, $params = array())
    {
        $params = array_merge(array('access_token' => $access_token), $params);
        $json = file_get_contents(static::GET_USER_URL.'?'.http_build_query($params));
        return json_decode($json);
    }

}
Githubクラスの各メソッドの引数で
$params = array()
とありますが、これを調整すればscopeの指定も出来るのかなーと思います。(実際にはやってません。。。)

尚、Githubクラスは
https://github.com/mp-php/fuel-myapp/blob/master/classes/my/github.php
にも置いてあります。(名前が少し違いますが。)

開発者向けのサイトなら、Github認証オンリーも有りなのかなーと思っていたりします。

No comments:

Post a Comment