Skip to content

Instantly share code, notes, and snippets.

@DBasic
Last active December 8, 2016 09:56
Show Gist options
  • Select an option

  • Save DBasic/64d597277f0a57c814fd to your computer and use it in GitHub Desktop.

Select an option

Save DBasic/64d597277f0a57c814fd to your computer and use it in GitHub Desktop.

Revisions

  1. DBasic revised this gist Dec 20, 2014. No changes.
  2. @aaronpk aaronpk created this gist Sep 3, 2012.
    89 changes: 89 additions & 0 deletions github-oauth2-client.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,89 @@
    <?php
    define('OAUTH2_CLIENT_ID', '');
    define('OAUTH2_CLIENT_SECRET', '');

    $authorizeURL = 'https://github.com/login/oauth/authorize';
    $tokenURL = 'https://github.com/login/oauth/access_token';
    $apiURLBase = 'https://api.github.com/';

    session_start();

    // Start the login process by sending the user to Github's authorization page
    if(get('action') == 'login') {
    // Generate a random hash and store in the session for security
    $_SESSION['state'] = hash('sha256', microtime(TRUE).rand().$_SERVER['REMOTE_ADDR']);
    unset($_SESSION['access_token']);

    $params = array(
    'client_id' => OAUTH2_CLIENT_ID,
    'redirect_uri' => 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'],
    'scope' => 'user',
    'state' => $_SESSION['state']
    );

    // Redirect the user to Github's authorization page
    header('Location: ' . $authorizeURL . '?' . http_build_query($params));
    die();
    }

    // When Github redirects the user back here, there will be a "code" and "state" parameter in the query string
    if(get('code')) {
    // Verify the state matches our stored state
    if(!get('state') || $_SESSION['state'] != get('state')) {
    header('Location: ' . $_SERVER['PHP_SELF']);
    die();
    }

    // Exchange the auth code for a token
    $token = apiRequest($tokenURL, array(
    'client_id' => OAUTH2_CLIENT_ID,
    'client_secret' => OAUTH2_CLIENT_SECRET,
    'redirect_uri' => 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'],
    'state' => $_SESSION['state'],
    'code' => get('code')
    ));
    $_SESSION['access_token'] = $token->access_token;

    header('Location: ' . $_SERVER['PHP_SELF']);
    }

    if(session('access_token')) {
    $user = apiRequest($apiURLBase . 'user');

    echo '<h3>Logged In</h3>';
    echo '<h4>' . $user->name . '</h4>';
    echo '<pre>';
    print_r($user);
    echo '</pre>';

    } else {
    echo '<h3>Not logged in</h3>';
    echo '<p><a href="?action=login">Log In</a></p>';
    }


    function apiRequest($url, $post=FALSE, $headers=array()) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    if($post)
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));

    $headers[] = 'Accept: application/json';

    if(session('access_token'))
    $headers[] = 'Authorization: Bearer ' . session('access_token');

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $response = curl_exec($ch);
    return json_decode($response);
    }

    function get($key, $default=NULL) {
    return array_key_exists($key, $_GET) ? $_GET[$key] : $default;
    }

    function session($key, $default=NULL) {
    return array_key_exists($key, $_SESSION) ? $_SESSION[$key] : $default;
    }