Файл: sngine-v2.8/Script/includes/libs/HybridAuth/Provider/Vkontakte.php
Строк: 162
<?php
/*!
* Hybridauth
* https://hybridauth.github.io | https://github.com/hybridauth/hybridauth
* (c) 2017 Hybridauth authors | https://hybridauth.github.io/license.html
*/
namespace HybridauthProvider;
use HybridauthAdapterOAuth2;
use HybridauthExceptionUnexpectedApiResponseException;
use HybridauthDataCollection;
use HybridauthUserProfile;
use HybridauthData;
use HybridauthUser;
/**
* Vkontakte provider adapter.
*
* Example:
*
* $config = [
* 'callback' => HybridauthHttpClientUtil::getCurrentUrl(),
* 'keys' => ['id' => '', 'secret' => ''],
* ];
*
* $adapter = new HybridauthProviderVkontakte($config);
*
* try {
* if (!$adapter->isConnected()) {
* $adapter->authenticate();
* }
*
* $userProfile = $adapter->getUserProfile();
* }
* catch(Exception $e) {
* print $e->getMessage() ;
* }
*/
class Vkontakte extends OAuth2
{
const API_VERSION = '5.95';
const URL = 'https://vk.com/';
/**
* {@inheritdoc}
*/
protected $apiBaseUrl = 'https://api.vk.com/method/';
/**
* {@inheritdoc}
*/
protected $authorizeUrl = 'https://api.vk.com/oauth/authorize';
/**
* {@inheritdoc}
*/
protected $accessTokenUrl = 'https://api.vk.com/oauth/token';
/**
* {@inheritdoc}
*/
protected $scope = 'email,offline';
/**
* {@inheritdoc}
*/
protected function initialize()
{
parent::initialize();
// The VK API requires version and access_token from authenticated users
// for each endpoint.
$accessToken = $this->getStoredData($this->accessTokenName);
$this->apiRequestParameters[$this->accessTokenName] = $accessToken;
$this->apiRequestParameters['v'] = static::API_VERSION;
}
/**
* {@inheritdoc}
*/
protected function validateAccessTokenExchange($response)
{
$data = parent::validateAccessTokenExchange($response);
// Need to store email for later use.
$this->storeData('email', $data->get('email'));
}
/**
* {@inheritdoc}
*/
public function hasAccessTokenExpired()
{
// As we using offline scope, $expired will be false.
$expired = $this->getStoredData('expires_in')
? $this->getStoredData('expires_at') <= time()
: false;
return $expired;
}
/**
* {@inheritdoc}
*/
public function getUserProfile()
{
$photoField = 'photo_' . ($this->config->get('photo_size') ?: 'max_orig');
$response = $this->apiRequest('users.get', 'GET', [
'fields' => 'screen_name,sex,education,bdate,has_photo,' . $photoField,
]);
if (property_exists($response, 'error')) {
throw new UnexpectedApiResponseException($response->error->error_msg);
}
$data = new Collection($response->response[0]);
if (!$data->exists('id')) {
throw new UnexpectedApiResponseException('Provider API returned an unexpected response.');
}
$userProfile = new Profile();
$userProfile->identifier = $data->get('id');
$userProfile->email = $this->getStoredData('email');
$userProfile->firstName = $data->get('first_name');
$userProfile->lastName = $data->get('last_name');
$userProfile->displayName = $data->get('screen_name');
$userProfile->photoURL = $data->get('has_photo') === 1 ? $data->get($photoField) : '';
// Handle b-date.
if ($data->get('bdate')) {
$bday = explode('.', $data->get('bdate'));
$userProfile->birthDay = (int) $bday[0];
$userProfile->birthMonth = (int) $bday[1];
$userProfile->birthYear = (int) $bday[2];
}
$userProfile->data = [
'education' => $data->get('education'),
];
$screen_name = static::URL . ($data->get('screen_name') ?: 'id' . $data->get('id'));
$userProfile->profileURL = $screen_name;
switch ($data->get('sex')) {
case 1:
$userProfile->gender = 'female';
break;
case 2:
$userProfile->gender = 'male';
break;
}
return $userProfile;
}
/**
* {@inheritdoc}
*/
public function getUserContacts()
{
$response = $this->apiRequest('friends.get', 'GET', [
'fields' => 'uid,name,photo_200_orig',
]);
$data = new DataCollection($response);
if (!$data->exists('response')) {
throw new UnexpectedApiResponseException('Provider API returned an unexpected response.');
}
$contacts = [];
if (!$data->filter('response')->filter('items')->isEmpty()) {
foreach ($data->filter('response')->filter('items')->toArray() as $item) {
$contacts[] = $this->fetchUserContact($item);
}
}
return $contacts;
}
/**
* Parse the user contact.
*
* @param array $item
*
* @return HybridauthUserContact
*/
protected function fetchUserContact($item)
{
$userContact = new UserContact();
$data = new DataCollection($item);
$userContact->identifier = $data->get('id');
$userContact->displayName = sprintf('%s %s', $data->get('first_name'), $data->get('last_name'));
$userContact->profileURL = static::URL . ($data->get('screen_name') ?: 'id' . $data->get('id'));
$userContact->photoURL = $data->get('photo_200_orig');
return $userContact;
}
}