Вход Регистрация
Файл: sngine-v2.8/Script/includes/libs/HybridAuth/Provider/Facebook.php
Строк: 267
<?php
/*!
* Hybridauth
* https://hybridauth.github.io | https://github.com/hybridauth/hybridauth
*  (c) 2017 Hybridauth authors | https://hybridauth.github.io/license.html
*/

namespace HybridauthProvider;

use 
HybridauthExceptionInvalidArgumentException;
use 
HybridauthExceptionUnexpectedApiResponseException;
use 
HybridauthAdapterOAuth2;
use 
HybridauthData;
use 
HybridauthUser;

/**
 * Facebook OAuth2 provider adapter.
 *
 * Example:
 *
 *   $config = [
 *       'callback' => HybridauthHttpClientUtil::getCurrentUrl(),
 *       'keys'     => [ 'id' => '', 'secret' => '' ],
 *       'scope'    => 'email, user_status, user_posts'
 *   ];
 *
 *   $adapter = new HybridauthProviderFacebook( $config );
 *
 *   try {
 *       $adapter->authenticate();
 *
 *       $userProfile = $adapter->getUserProfile();
 *       $tokens = $adapter->getAccessToken();
 *       $response = $adapter->setUserStatus("Hybridauth test message..");
 *   }
 *   catch( Exception $e ){
 *       echo $e->getMessage() ;
 *   }
 */
class Facebook extends OAuth2
{
    
/**
     * {@inheritdoc}
     */
    
protected $scope 'email, public_profile';

    
/**
     * {@inheritdoc}
     */
    
protected $apiBaseUrl 'https://graph.facebook.com/v6.0/';

    
/**
     * {@inheritdoc}
     */
    
protected $authorizeUrl 'https://www.facebook.com/dialog/oauth';

    
/**
     * {@inheritdoc}
     */
    
protected $accessTokenUrl 'https://graph.facebook.com/oauth/access_token';

    
/**
     * {@inheritdoc}
     */
    
protected $apiDocumentation 'https://developers.facebook.com/docs/facebook-login/overview';

    
/**
     * @var string Profile URL template as the fallback when no `link` returned from the API.
     */
    
protected $profileUrlTemplate 'https://www.facebook.com/%s';

    
/**
     * {@inheritdoc}
     */
    
protected function initialize()
    {
        
parent::initialize();

        
// Require proof on all Facebook api calls
        // https://developers.facebook.com/docs/graph-api/securing-requests#appsecret_proof
        
if ($accessToken $this->getStoredData('access_token')) {
            
$this->apiRequestParameters['appsecret_proof'] = hash_hmac('sha256'$accessToken$this->clientSecret);
        }
    }

    
/**
     * {@inheritdoc}
     */
    
public function getUserProfile()
    {
        
$fields = [
            
'id',
            
'name',
            
'first_name',
            
'last_name',
            
'link',
            
'website',
            
'gender',
            
'locale',
            
'about',
            
'email',
            
'hometown',
            
'birthday',
        ];
        
$response $this->apiRequest('me?fields=' implode(','$fields));

        
$data = new DataCollection($response);

        if (!
$data->exists('id')) {
            throw new 
UnexpectedApiResponseException('Provider API returned an unexpected response.');
        }

        
$userProfile = new UserProfile();

        
$userProfile->identifier $data->get('id');
        
$userProfile->displayName $data->get('name');
        
$userProfile->firstName $data->get('first_name');
        
$userProfile->lastName $data->get('last_name');
        
$userProfile->profileURL $data->get('link');
        
$userProfile->webSiteURL $data->get('website');
        
$userProfile->gender $data->get('gender');
        
$userProfile->language $data->get('locale');
        
$userProfile->description $data->get('about');
        
$userProfile->email $data->get('email');

        
// Fallback for profile URL in case Facebook does not provide "pretty" link with username (if user set it).
        
if (empty($userProfile->profileURL)) {
            
$userProfile->profileURL $this->getProfileUrl($userProfile->identifier);
        }

        
$userProfile->region $data->filter('hometown')->get('name');

        
$photoSize $this->config->get('photo_size') ?: '150';

        
$userProfile->photoURL $this->apiBaseUrl $userProfile->identifier;
        
$userProfile->photoURL .= '/picture?width=' $photoSize '&height=' $photoSize;

        
$userProfile->emailVerified $userProfile->email;

        
$userProfile $this->fetchUserRegion($userProfile);

        
$userProfile $this->fetchBirthday($userProfile$data->get('birthday'));

        return 
$userProfile;
    }

    
/**
     * Retrieve the user region.
     *
     * @param UserProfile $userProfile
     *
     * @return HybridauthUserProfile
     */
    
protected function fetchUserRegion(UserProfile $userProfile)
    {
        if (!empty(
$userProfile->region)) {
            
$regionArr explode(','$userProfile->region);

            if (
count($regionArr) > 1) {
                
$userProfile->city trim($regionArr[0]);
                
$userProfile->country trim($regionArr[1]);
            }
        }

        return 
$userProfile;
    }

    
/**
     * Retrieve the user birthday.
     *
     * @param UserProfile $userProfile
     * @param string $birthday
     *
     * @return HybridauthUserProfile
     */
    
protected function fetchBirthday(UserProfile $userProfile$birthday)
    {
        
$result = (new DataParser())->parseBirthday($birthday'/');

        
$userProfile->birthYear = (int)$result[0];
        
$userProfile->birthMonth = (int)$result[1];
        
$userProfile->birthDay = (int)$result[2];

        return 
$userProfile;
    }

    
/**
     * /v2.0/me/friends only returns the user's friends who also use the app.
     * In the cases where you want to let people tag their friends in stories published by your app,
     * you can use the Taggable Friends API.
     *
     * https://developers.facebook.com/docs/apps/faq#unable_full_friend_list
     */
    
public function getUserContacts()
    {
        
$contacts = [];

        
$apiUrl 'me/friends?fields=link,name';

        do {
            
$response $this->apiRequest($apiUrl);

            
$data = new DataCollection($response);

            if (!
$data->exists('data')) {
                throw new 
UnexpectedApiResponseException('Provider API returned an unexpected response.');
            }

            if (!
$data->filter('data')->isEmpty()) {
                foreach (
$data->filter('data')->toArray() as $item) {
                    
$contacts[] = $this->fetchUserContact($item);
                }
            }

            if (
$data->filter('paging')->exists('next')) {
                
$apiUrl $data->filter('paging')->get('next');

                
$pagedList true;
            } else {
                
$pagedList false;
            }
        } while (
$pagedList);

        return 
$contacts;
    }

    
/**
     * Parse the user contact.
     *
     * @param array $item
     *
     * @return HybridauthUserContact
     */
    
protected function fetchUserContact($item)
    {
        
$userContact = new UserContact();

        
$item = new DataCollection($item);

        
$userContact->identifier $item->get('id');
        
$userContact->displayName $item->get('name');

        
$userContact->profileURL $item->exists('link')
            ?: 
$this->getProfileUrl($userContact->identifier);

        
$userContact->photoURL $this->apiBaseUrl $userContact->identifier '/picture?width=150&height=150';

        return 
$userContact;
    }

    
/**
     * {@inheritdoc}
     */
    
public function setPageStatus($status$pageId)
    {
        
$status is_string($status) ? ['message' => $status] : $status;

        
// Post on user wall.
        
if ($pageId === 'me') {
            return 
$this->setUserStatus($status);
        }

        
// Retrieve writable user pages and filter by given one.
        
$pages $this->getUserPages(true);
        
$pages array_filter($pages, function ($page) use ($pageId) {
            return 
$page->id == $pageId;
        });

        if (!
$pages) {
            throw new 
InvalidArgumentException('Could not find a page with given id.');
        }

        
$page reset($pages);

        
// Use page access token instead of user access token.
        
$headers = [
            
'Authorization' => 'Bearer ' $page->access_token,
        ];

        
// Refresh proof for API call.
        
$parameters $status + [
            
'appsecret_proof' => hash_hmac('sha256'$page->access_token$this->clientSecret),
        ];

        
$response $this->apiRequest("{$pageId}/feed"'POST'$parameters$headers);

        return 
$response;
    }

    
/**
     * {@inheritdoc}
     */
    
public function getUserPages($writable false)
    {
        
$pages $this->apiRequest('me/accounts');

        if (!
$writable) {
            return 
$pages->data;
        }

        
// Filter user pages by CREATE_CONTENT permission.
        
return array_filter($pages->data, function ($page) {
            return 
in_array('CREATE_CONTENT'$page->tasks);
        });
    }

    
/**
     * {@inheritdoc}
     */
    
public function getUserActivity($stream 'me')
    {
        
$apiUrl $stream == 'me' 'me/feed' 'me/home';

        
$response $this->apiRequest($apiUrl);

        
$data = new DataCollection($response);

        if (!
$data->exists('data')) {
            throw new 
UnexpectedApiResponseException('Provider API returned an unexpected response.');
        }

        
$activities = [];

        foreach (
$data->filter('data')->toArray() as $item) {
            
$activities[] = $this->fetchUserActivity($item);
        }

        return 
$activities;
    }

    
/**
     * @param $item
     *
     * @return UserActivity
     */
    
protected function fetchUserActivity($item)
    {
        
$userActivity = new UserActivity();

        
$item = new DataCollection($item);

        
$userActivity->id $item->get('id');
        
$userActivity->date $item->get('created_time');

        if (
'video' == $item->get('type') || 'link' == $item->get('type')) {
            
$userActivity->text $item->get('link');
        }

        if (empty(
$userActivity->text) && $item->exists('story')) {
            
$userActivity->text $item->get('link');
        }

        if (empty(
$userActivity->text) && $item->exists('message')) {
            
$userActivity->text $item->get('message');
        }

        if (!empty(
$userActivity->text) && $item->exists('from')) {
            
$userActivity->user->identifier $item->filter('from')->get('id');
            
$userActivity->user->displayName $item->filter('from')->get('name');

            
$userActivity->user->profileURL $this->getProfileUrl($userActivity->user->identifier);

            
$userActivity->user->photoURL $this->apiBaseUrl $userActivity->user->identifier;
            
$userActivity->user->photoURL .= '/picture?width=150&height=150';
        }

        return 
$userActivity;
    }

    
/**
     * Get profile URL.
     *
     * @param int $identity User ID.
     * @return string|null NULL when identity is not provided.
     */
    
protected function getProfileUrl($identity)
    {
        if (!
is_numeric($identity)) {
            return 
null;
        }

        return 
sprintf($this->profileUrlTemplate$identity);
    }
}
Онлайн: 3
Реклама