datatable.directory codebase https://datatable.directory/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
datatable.directory/sideload/socialnorm/stackoverflow/src/StackOverflowProvider.php

117 lines
2.9 KiB

<?php namespace SocialNorm\StackOverflow;
use SocialNorm\Exceptions\AuthNotUsableException;
use SocialNorm\Exceptions\InvalidAuthorizationCodeException;
use SocialNorm\Providers\OAuth2Provider;
use GuzzleHttp\Client as HttpClient;
use SocialNorm\Request;
// https://stackapps.com/apps/oauth/view/12789
// https://api.stackexchange.com/docs/authentication
// This is entirely untested; it might work, but since we don't get e-mail from it,
// it's use as an auth method is problematic.
class StackOverflowProvider extends OAuth2Provider
{
protected $authorizeUrl = "https://stackoverflow.com/oauth";
protected $accessTokenUrl = "https://stackoverflow.com/oauth/access_token";
protected $userDataUrl = "https://api.stackexchange.com/2.2/me";
protected $scope = [];
private $key;
protected $headers = [
'authorize' => [],
'access_token' => [
'Accept' => 'application/json',
'Content-Type' => 'application/x-www-form-urlencoded'
],
'user_details' => [],
];
protected function providerName()
{
return 'stack';
}
public function __construct(array $config, HttpClient $httpClient, Request $request)
{
parent::__construct($config, $httpClient, $request);
$this->key = $config['key'];
}
protected function compileScopes()
{
return implode(' ', $this->scope);
}
protected function getAuthorizeUrl()
{
return $this->authorizeUrl;
}
protected function getAccessTokenBaseUrl()
{
return $this->accessTokenUrl;
}
protected function getUserDataUrl()
{
return $this->userDataUrl;
}
protected function buildUserDataUrl()
{
$url = $this->getUserDataUrl();
$url .= "?access_token=".$this->accessToken
. "&site=stackoverflow"
. "&key=".$this->key;
return $url;
}
protected function parseTokenResponse($response)
{
return explode('=', $response, 2)[1];
}
protected function parseUserDataResponse($response)
{
$decoded = (array)json_decode($response, true);
if ($decoded === false || json_last_error())
throw new InvalidAuthorizationCodeException('Corrupt response json: ' . $response . ", error " . json_last_error_msg());
if (0 == count(array_get($decoded, 'items'))) {
throw new AuthNotUsableException('No profile on StackOverflow. Resp: '.$response);
}
return $decoded;
}
protected function userId()
{
return array_get($this->providerUserData, 'items.0.account_id');
}
protected function nickname()
{
return array_get($this->providerUserData, 'items.0.display_name');
}
protected function fullName()
{
return array_get($this->providerUserData, 'items.0.display_name');
}
protected function avatar()
{
return array_get($this->providerUserData, 'items.0.profile_image');
}
protected function email()
{
return null;
}
}