[PHP] Integracja z Google API

Dyskusja w 'Kursy i poradniki - twórczość własna' rozpoczęta przez użytkownika antyhelion, 30 Listopad 2015.

  1. antyhelion

    antyhelion Nowicjusz

    Wiadomości:
    20
    Docenione treści:
    13
    Dzisiaj chciałbym się z Wami podzielić moją autorską klasą, do obsługi Google API, na przykładzie logowania.
    Tworzymy plik o nazwie np. Google_API.php, a do niego wklejamy:
    PHP:
    <?php

        define
    ('GOOGLE_CLIENT_ID', 'Twoje ID Google');
        
    define('GOOGLE_CLIENT_SECRET', 'Twój sekretny klucz');
        
    define('CONFIG_CURRENT_DOMAIN', 'twoja-strona.com');

        class 
    Google_API
        
    {
            public function 
    __construct($redirect_uri = null)
            {
                
    $this->redirect_uri = urlencode($redirect_uri);
                
    $this->client_id = GOOGLE_CLIENT_ID;
                
    $this->client_secret = GOOGLE_CLIENT_SECRET;
            }

            public function 
    Dialog($scope = null)
            {
                
    $state = uniqid();
                if (isset(
    $_COOKIE['google_access_state'])) {
                    
    setcookie('google_access_state', null, time() - 3600, '/', '.' . CONFIG_CURRENT_DOMAIN);
                }
                
    setcookie('google_access_state', $state, time() + 3600, '/', '.' . CONFIG_CURRENT_DOMAIN);

                return 
    sprintf("https://accounts.google.com/o/oauth2/auth?client_id=%s&scope=%s&redirect_uri=%s&state=%s&response_type=code",
                    
    $this->client_id, $scope, $this->redirect_uri, $state
                
    );
            }

            public function 
    GetAccessToken($scope)
            {
                if (
    $this->IsAccessToken($scope) === true) {
                    return 
    $_COOKIE['GOOGLE_ACCESS_TOKEN_' . md5($scope)];
                }

                
    $params = sprintf("code=%s&client_id=%s&client_secret=%s&redirect_uri=%s&grant_type=authorization_code",
                    
    $_GET['code'], $this->client_id, $this->client_secret, $this->redirect_uri
                
    );

                
    $oCURL = curl_init();
                
    curl_setopt($oCURL, CURLOPT_URL, 'https://accounts.google.com/o/oauth2/token');
                
    curl_setopt($oCURL, CURLOPT_POST, 1);
                
    curl_setopt($oCURL, CURLOPT_POSTFIELDS, $params);
                
    curl_setopt($oCURL, CURLOPT_RETURNTRANSFER, 1);
                
    $response = json_decode(curl_exec($oCURL), true);
                
    curl_close($oCURL);

                if (!isset(
    $response['access_token'])) {
                    return 
    0;
                }

                
    setcookie('GOOGLE_ACCESS_TOKEN_' . md5($scope), $response['access_token'], time() + $response['expires_in'], '/', $_SERVER['SERVER_NAME']);
                return 
    $response['access_token'];
            }

            public function 
    Get($scope = null)
            {
                
    $access_token = $this->GetAccessToken($scope);
                if (empty(
    $access_token)) {
                    return array();
                }

                
    $oCURL = curl_init();
                
    curl_setopt($oCURL, CURLOPT_URL, $scope);
                
    curl_setopt($oCURL, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $access_token));
                
    curl_setopt($oCURL, CURLOPT_RETURNTRANSFER, true);
                
    $response = curl_exec($oCURL);
                
    curl_close($oCURL);

                return 
    $response;
            }

            public function 
    IsAccessToken($scope = null)
            {
                if (isset(
    $_COOKIE['GOOGLE_ACCESS_TOKEN_' . md5($scope)])) {
                    return 
    true;
                }

                return 
    false;
            }
        }
    Teraz tworzymy np. plik signin.php, w którym powinno się znaleźć:
    PHP:
    <?php

        ob_start
    ();

        include_once(
    'Google_API.php');

        
    // Tutaj ustawiamy przekierowanie powrotne, na które Google zwróci dane
        
    $oGoogle_API = new Google_API('http://twoja-strona.com/signin.php');

        if (!isset(
    $_GET['code']) OR !isset($_GET['state'])) {
            
    $dialog = $oGoogle_API->Dialog('email');
            
    Header('Location: ' . $dialog); exit;
        }

        
    $google_access_state = empty($_COOKIE['google_access_state']) ? 0 : $_COOKIE['google_access_state'];
        if (
    $_GET['state'] !== $google_access_state) {
            
    // tutaj np. przekierowanie, jeżeli dane są błędne
        
    }

        
    $graph = $oGoogle_API->Get('https://www.googleapis.com/oauth2/v3/userinfo');
        
    $graph = json_decode($graph, true);

        if (!isset(
    $graph['email'])) {
            
    // tutaj np. przekierowanie, jeżeli nie udało się pobrać danych konta Google
        
    }

        
    // Wyświetlamy adres e-mail użytkownika, który dokonał autoryzacji.
        
    echo $graph['email'];
    I to tyle, w przypadku pytań, proszę śmiało :)

    Pozdrawiam,
    Rafał
     
    TheL i Mariusz lubią to.
  2. Mariusz

    Mariusz pomoc.home.pl Moderator forum

    Wiadomości:
    3 087
    Docenione treści:
    302
    Kliknąłem lubię to :p, ale jeszcze nie sprawdziłem!

    Witam na naszym forum i mam nadzieję, że zostaniesz z nami na dłużej :). Jeśli czas pozwoli to sprawdzę opublikowany przez Ciebie kod i odniosę się do niego jutro :)
     
  3. antyhelion

    antyhelion Nowicjusz

    Wiadomości:
    20
    Docenione treści:
    13
    Również witam i dziękuję ;-)

    Kod działa bez żadnego problemu, bo jest wykorzystywany na co dzień w moich serwisach, więc sprawdzany jest każdego dnia "na żywym organizmie" :)
    Oczywiście trzeba pamiętać o ustawieniu w konsoli Google odpowiednich credentials do przekierowania i pamiętać również o tym, że Google nie akceptuje hostów lokalnych jako "redirect_uri", więc trzeba testować na normalnej domenie.

    Ale to oczywiste :)
     
  4. TheL

    TheL @Lider VIP Beta-tester

    Wiadomości:
    2 403
    Docenione treści:
    535
    podoba mi się :) jak rozumiem klasa do dowolnego użytku? :)
     
  5. antyhelion

    antyhelion Nowicjusz

    Wiadomości:
    20
    Docenione treści:
    13
    @TheL oczywiście, korzystaj śmiało ;-)
     

Poleć forum znajomym