Идентификатор GOOGLE – использование PHP

Я пытаюсь использовать Google-ID с помощью PHP-кода.

Некоторые уточнения:

Я посмотрел пример на https://developers.google.com/+/web/signin/server-side-flow

Я не понимаю пример на шагах 2+7 (это веточка? Я не знаю ветки и у меня ее нет).

Шаг 6. У меня есть допустимое значение для: authResult['code'], но я не могу вызвать plus.php (это plus.php в библиотеке: https://code.google.com/p/google-api-php-client/?

Если да - то он тоже не компилируется (ищет класс Google_Client, которого не находит - видимо баг в гугле, так как мне нужно скопировать все классы где есть plus.php.

Спасибо :)


person Eitan    schedule 17.08.2014    source источник


Ответы (1)


Поскольку я решил проблему сам, я хотел бы внести свой вклад в решение.

Документы Google+ не объясняются должным образом, и есть некоторые ошибки, с которыми мне пришлось иметь дело.

Вы можете посмотреть: https://developers.google.com/+/web/signin/add-button и на: https://developers.google.com/+/web/signin/server-side-flow.

Для сервера Google:

Создайте проект и ссылку на стороне сервера Google (наконец, у вас должны быть «Compute Engine и App Engine», «Идентификатор клиента для веб-приложения», «Ключ для серверных приложений»).

1. Go to : https://console.developers.google.com/project Project +
create project. Named the project+id.

2.  Add google+ API. APIS & AUT -> APIS. Add Google+ (Enable it).
3. Go to APIS & AUT -> Credentials. Create new client ID (For Web application). Authorized JavaScript – enter the site name (maybe
several lines). Authorized redirect URI – Clear it. Attention:
Client id + Client secret are declared.
4. Go to APIS & AUT -> Credentials. Create a new key, Choose server key, and press "Create".

Для вас на стороне php:

  1. Загрузите библиотеку php API с: https://code.google.com/p/google-api-php-client/

  2. Файл Client.php должен находиться в папке Google из-за небольшой ошибки, из-за которой вы не можете включить его в свой сценарий, если только вы не сделаете небольшую хитрость, как объяснено позже, поэтому измените папку, если это необходимо, и поместите всю папку на свой сайт (только эта папка и подпапки). Исправление может выглядеть так:

    set_include_path(get_include_path() . PATH_SEPARATOR . DIR );

  3. Вы должны хранить в переменных $_SESSION значения токена и адрес электронной почты (пользователя, который входит в систему). Это можно проверить позже, например $_SESSION["TOKEN"] = $_POST["TOKEN"] на предмет подделки.

  4. Для получения электронной почты пользователя вам необходимо добавить область действия в виде следующего кода:

    $google_client->addScope(Google_Service_Oauth2::USERINFO_PROFILE);
    $google_client->addScope(Google_Service_Oauth2::USERINFO_EMAIL);
    

    /* ... */

    $me = $plus->people->get("me");
    $email = $me['emails'][0]['value'];
    

Как видите, $me — это магия, которая извлекает текущего пользователя. 5. На стороне клиента вам нужно использовать только одну кнопку (даже для входа и авторизации). Используйте одну и ту же форму для входа и входа и поменяйте ее местами с помощью какой-либо команды jquery, например html().

  1. Вам нужно будет использовать API Google и сделать кнопку со ссылкой обратного вызова.

Вот php-код:

<?php
# REQUIRED MODULES:
/*.
    require_module 'standard';
    require_module 'mysqli';
    require_module 'spl';
    require_module 'simplexml';
    require_module 'dom';
    require_module 'session';
.*/
require_once __DIR__ . "/stdlib/all.php";
require_once __DIR__ . '/Google/Client.php';
require_once __DIR__ . '/Google/Service/Plus.php';

/*. string .*/ $aut_code = "";
session_start();

    try {
        $aut_code = $_POST["code"];
        set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ ); /* the fix for using the 'google' library, unless it will not run properly */
        $id = "<Client-id from 'Compute Engine and App Engine'";
        $google_client = new Google_Client();

        $google_client->setApplicationName("your application name created in google side");
        $google_client->setClientId("Client-id of 'Client ID for web application'");
        $google_client->setClientSecret("Client secret of 'Client ID for web application'");
        $google_client->setRedirectUri("postmessage"); /* alway postmessage. */
        $google_client->setDeveloperKey("Api key of 'Key for server applications'");

        $google_client->addScope(Google_Service_Oauth2::USERINFO_PROFILE); /* important for getting access to user profile */
        $google_client->addScope(Google_Service_Oauth2::USERINFO_EMAIL);/* important for getting access to user email */

        $google_client->setAccessType("offline");
        $google_client->authenticate($aut_code);
        $access_token = $google_client->getAccessToken();
        $plus = new Google_Service_Plus($google_client);
        $_SESSION['access_token'] = $access_token;
        $me = $plus->people->get("me"); /* me is the current logged in user */
        $email = $me['emails'][0]['value'];
        $_SESSION["EMAIL"] = $email; /* keep in session variable whatever you send to client */
        $_SESSION["GOOGLELOGIN"] = 1; /* keep in session variable whatever you send to client */
        echo "ok," . urlencode($access_token) . "\n" . $email; /* response from server */
    } catch(Exception $e) {
        echo "error:" . $e->getMessage();
    }
?>

Часть html разделена на две части:

В разделе body вы должны добавить кнопку:

<div id="id_googleSignInDlg">
    <table>
        <tr>
            <td id="id_googlelogDesc">
            Google log in:
            </td>
            <td id="id_googlelogButton">
              <span class="g-signin"
                data-scope="https://www.googleapis.com/auth/userinfo.email"
                data-clientid="Client ID for web application"
                data-redirecturi="postmessage"
                data-accesstype="offline"
                data-cookiepolicy="single_host_origin"
                data-callback="googleSignInCallbackLog"
                data-approvalprompt="force"
                data-height="short"
                >
              </span>
            </td>
        </tr>
    </table>
    <div id="id_logreg"></div>
</div>

и для ссылки на google.

   <script>
    (function () {
      var po = document.createElement('script');
      po.type = 'text/javascript';
      po.async = true;
      po.src = 'https://plus.google.com/js/client:plusone.js?onload=start';
      var s = document.getElementsByTagName('script')[0];
      s.parentNode.insertBefore(po, s);
    })();
    </script>

не забудьте включить:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js">

в Javascript выполните:

    function googleSignInCallbackLog(authResult) {
    'use strict';
    var s,
        temps,
        values;
    $("#id_googleSignInDlg").dialog("close");
    if (authResult.code) {
        $.ajax({
            url: 'googleOpenIdLogin.php',
            type: 'POST',
            dataType: "html",
            success: function (result) {
                s = result;
                if (s.substring(0, 3) === 'ok,') {
                    temps = s.substring(3, 4000);
                    values = temps.split("\n");
                    googleToken = decodeURIComponent(values[0]);
                    newAccountOn = false;
// check login.
                } else {
                    // error !!!
                }
            },
            data: {
                'code': authResult.code
            }
        });
    } else if (authResult.error) {
        $("#id_googleSignIn").dialog("close");
    }
}

id_googleSignInDlg — это диалоговое окно, которое динамически включает HTML-часть кнопки google+.

И, наконец, при использовании одного диалога для двух возможностей (вход и вход) у вас должен быть такой код:

function loginclick() {
    'use strict';
    if ($("#id_regdialog").html() === "") {
        $("#id_regdialog").html($("#id_logreg").html());
    }
    if ($("#id_logindialog").html() !== "") {
        $("#id_logreg").html($("#id_logindialog").html());
    }
    $("#id_logindialog").html("");
...
    $("#id_googlelogButton").css("opacity", 1);
...
}

и поскольку кнопка google отображается на экране менее секунды - может раздражать, вы можете иметь в файле css следующий стиль:

-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
opacity: 0;

Надеюсь, этот пост будет полезен.

person Eitan    schedule 26.08.2014