получить данные пользователя из github после аутентификации - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть страница входа, которая направляет пользователя на GitHub для аутентификации.После аутентификации GitHub успешно возвращает код и статус GET-параметров на мою страницу входа.Есть ли способ получить электронную почту, имя и адрес пользователя GitHub после получения access_token?

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')
      ));
       echo var_dump($token) ."<br>";
      echo json_encode($token);
      $_SESSION['access_token'] = $token->access_token;
      header('Location: ' . $_SERVER['PHP_SELF']);
    }
  }


  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;
  }

1 Ответ

0 голосов
/ 01 декабря 2018

Вам необходимо вызвать Github API с токеном доступа для доступа к текущему пользователю.

Так что, если у вас уже есть доступный токен и он успешно сохранен в $_SESSION['access_token'] - он будет использоваться автоматически для всех последующихзапросы, выполняемые apiRequest() вызовами метода

$user = apiRequest("https://api.github.com/user');
var_dump($user);
// $user->name  should be available in response

Когда я проверял ваш код - метод apiRequest-Method возвратил ошибку (var_dump($response))

Request forbidden by administrative rules. Please make sure your request has a User-Agent header (http://developer.github.com/v3/#user-agent-required). Check https://developer.github.com for other possible causes.

Просто добавьте User-Agent к массиву headers[] в методе (например, прямо под добавленным заголовком Accept:)

$headers[] = 'User-Agent: PHP Api Call';

... и ваш API-вызов будет работать;)

Редактировать: поскольку вы установили 'scope' => 'user', в своем первоначальном запросе аутентификации - вы запросили доступ к данным пользователя - но не более того (см. OAuth-App-Scopes , если вам нужны дополнительные разрешения / информация)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...