1. Forum używa plików Cookies. Dowiedz się więcej o celu ich używania i możliwości zmiany ustawień Cookies w przeglądarce. Czytaj więcej...

[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'nulltime() - 3600'/''.' CONFIG_CURRENT_DOMAIN);
                }
                
    setcookie('google_access_state'$statetime() + 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($oCURLCURLOPT_URL'https://accounts.google.com/o/oauth2/token');
                
    curl_setopt($oCURLCURLOPT_POST1);
                
    curl_setopt($oCURLCURLOPT_POSTFIELDS$params);
                
    curl_setopt($oCURLCURLOPT_RETURNTRANSFER1);
                
    $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($oCURLCURLOPT_URL$scope);
                
    curl_setopt($oCURLCURLOPT_HTTPHEADER, array('Authorization: OAuth ' $access_token));
                
    curl_setopt($oCURLCURLOPT_RETURNTRANSFERtrue);
                
    $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']) ? $_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($graphtrue);

        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 BOK home.pl home.pl Administrator forum

    Wiadomości:
    3 034
    Docenione treści:
    300
    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 Moderator forum

    Wiadomości:
    2 293
    Docenione treści:
    495
    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