Как создать токен состояния защиты от подделки запросов при регистрации на стороне сервера Google+

    <?php
     require_once '/google-api-php-client/src/Google_Client.php';
     require_once '/google-api-php-client/src/contrib/Google_PlusService.php';

     session_start();
     // Create a state token to prevent request forgery.
     // Store it in the session for later validation.
     $state = md5(rand());
     $app['session']->set('state', $state);
     // Set the client ID, token state, and application name in the HTML while
     // serving it.
     return $app['twig']->render('index.html', array(
      'CLIENT_ID' => CLIENT_ID,
      'STATE' => $state,
      'APPLICATION_NAME' => APPLICATION_NAME
     ));

      // Ensure that this is no request forgery going on, and that the user
     // sending us this connect request is the user that was supposed to.
    if ($request->get('state') != ($app['session']->get('state'))) {
    return new Response('Invalid state parameter', 401);
   }


    $code = $request->getContent();
    $gPlusId = $request->get['gplus_id'];
    // Exchange the OAuth 2.0 authorization code for user credentials.
    $client->authenticate($code);

    $token = json_decode($client->getAccessToken());
    // Verify the token
    $reqUrl = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=' .
          $token->access_token;
    $req = new Google_HttpRequest($reqUrl);

    $tokenInfo = json_decode(
      $client::getIo()->authenticatedRequest($req)->getResponseBody());

     // If there was an error in the token info, abort.
    if ($tokenInfo->error) {
    return new Response($tokenInfo->error, 500);
    }
     // Make sure the token we got is for the intended user.
     if ($tokenInfo->userid != $gPlusId) {
      return new Response(
        "Token's user ID doesn't match given user ID", 401);
     }
    // Make sure the token we got is for our app.
    if ($tokenInfo->audience != CLIENT_ID) {
    return new Response(
        "Token's client ID does not match app's.", 401);
    }

    // Store the token in the session for later use.
    $app['session']->set('token', json_encode($token));
    $response = 'Succesfully connected with token: ' . print_r($token, true);
   ?>

Это мой code.php.
Я взял этот код с сайта https://developers.google.com/+/web/signin/server-side-flow. Я хочу добавить в свое приложение регистрацию на стороне сервера Google+. поэтому я решил запустить пример кода. Я получаю сообщение об ошибке, пока я запускаю код. Я уже включил клиентскую библиотеку API Google для PHP. Я не могу использовать функцию установки и рендеринга, которые показаны в коде.

this is My index.html


    <!-- The top of file index.html -->
    <html itemscope itemtype="http://schema.org/Article">
    <head>
    <!-- BEGIN Pre-requisites -->
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js">
    </script>
    <script type="text/javascript">
     (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>
  <!-- END Pre-requisites -->
</head>
<!-- ... -->
</html>

<!-- Add where you want your sign-in button to render -->
<div id="signinButton">
  <span class="g-signin"
    data-scope="https://www.googleapis.com/auth/plus.login"
    data-clientid="YOUR_CLIENT_ID"
    data-redirecturi="postmessage"
    data-accesstype="offline"
    data-cookiepolicy="single_host_origin"
    data-callback="signInCallback">
  </span>
</div>
<div id="result"></div>

    <!-- Last part of BODY element in file index.html -->
   <script type="text/javascript">

      function signInCallback(authResult) {
      if (authResult['code']) {

      // Hide the sign-in button now that the user is authorized, for example:
     $('#signinButton').attr('style', 'display: none');

     // Send the code to the server
     $.ajax({
      type: 'POST',
      url: 'plus.php?storeToken',
      contentType: 'application/octet-stream; charset=utf-8',
      success: function(result) {
        // Handle or verify the server response if necessary.

        // Prints the list of people that the user has allowed the app to know
        // to the console.
        console.log(result);
        if (result['profile'] && result['people']){
          $('#results').html('Hello ' + result['profile']['displayName'] + '. You successfully made a server side call to people.get and people.list');
        } else {
          $('#results').html('Failed to make a server-side call. Check your configuration and console.');
        }
      },
      processData: false,
      data: authResult['code']
    });
    }  
     else if (authResult['error']) {
      // There was an error.
      // Possible error codes:
      //   "access_denied" - User denied access to your app
      //   "immediate_failed" - Could not automatially log in the user
      // console.log('There was an error: ' + authResult['error']);
    }
    }
  </script>

person user2330998    schedule 29.04.2013    source источник
comment
Какую ошибку вы получаете???   -  person Rakesh Sankar    schedule 29.04.2013
comment
эй, проблема в code.php, я использую функцию установки и рендеринга, которые определены в клиентской библиотеке Google API. И я перемещаюсь по всей библиотеке. Есть много разных функций установки и рендеринга. поэтому я не знаю, какой из них я должен использовать   -  person user2330998    schedule 29.04.2013
comment
эй, index.html не выдается ошибка. Основная проблема заключается в том, что функции рендеринга определены в клиентской библиотеке Google API, и эти две функции определены в двух разных классах. Поэтому я должен создать объект класса. Но я не знаю, для какого класса я должен сделать экземпляр. Поскольку эти две функции определены в нескольких файлах в клиентской библиотеке API Google.   -  person user2330998    schedule 29.04.2013
comment
Примечание. Неопределенная переменная: приложение в E:\wamp\www\google+\code.php в строке 11. Неустранимая ошибка: вызов функции-члена set() для необъекта в E:\wamp\www\google+\code. php в строке 11   -  person user2330998    schedule 29.04.2013
comment
Кто-нибудь, помогите мне. Я ищу помощь. Во всей клиентской библиотеке API Google есть много функций установки и рендеринга. какую функцию установить и отобразить, которую я должен использовать. Пожалуйста, помогите мне   -  person user2330998    schedule 29.04.2013


Ответы (2)


Я считаю, что проблема связана с документацией, предоставляющей вам неполные фрагменты кода (я обнаружил ошибку об этом). Этот конкретный пример основан на Symfony, и именно с этим вы столкнулись с отсутствующей переменной/методом.

Краткое руководство по PHP содержит полные инструкции по настройке этого примера. Вы также можете получить полный исходный код на Github.

Конечно, вам не обязательно использовать Symfony, но если вы решите использовать нативные методы PHP, вам нужно будет обновить ссылки на $request, $app и другие методы Symfony, используемые в примере.

person BrettJ    schedule 29.04.2013
comment
Эй, я уже видел код Github. Что я пытаюсь сделать, так это включить кнопку регистрации Google+ в свое приложение, и аутентификация должна выполняться сервером, и я также должен собирать информацию о пользователе. - person user2330998; 29.04.2013
comment
Код быстрого запуска должен справиться с этим за вас. Метод /connect, начинающийся в строке 82, содержит логику для обмена одноразового кода как на токен обновления, так и на токен доступа, который может удерживать ваш сервер. Токены на стороне сервера с кнопкой входа в Google+ — это гибридный поток между клиентом и сервером. Это не совсем на стороне сервера. Если вам нужен полностью серверный поток, вам нужно использовать собственный OAuth, используя клиентскую библиотеку Google PHP и используя тип доступа в автономном режиме с URI перенаправления. Кнопка входа в Google+ всегда использует redirect_uri сообщения. - person BrettJ; 01.05.2013

ОБНОВЛЕНИЕ:

Ссылки для входа/регистрации:

  1. http://www.w3resource.com/API/google-plus/tutorial.php
  2. http://rscavilla.blogspot.in/2011/06/using-oauth-20-with-php-to-authenticate.html

Чтобы получить информацию о пользователе:

Посмотрите на этот код для получения информации о пользователе из Google+ API.

Проблема в том, что в вашем приложении нет объекта $app, который может вызывать метод set, когда ваше приложение пытается установить состояние в сеансе.

Тем не менее, документация на стороне Google сообщает пользователю, который читает документ, чтобы убедиться, что значение состояния сохранено в его сеансе приложения, и как следует хранить другое необходимое значение для API google_auth.

Учебник:

Перейдите по этой ссылке, чтобы получить более подробную информацию. руководство по настройке и использованию Google OAuth API.

person Rakesh Sankar    schedule 29.04.2013
comment
эй Спасибо за вашу ссылку. Это регистрация на стороне сервера для Google+? - person user2330998; 29.04.2013
comment
эй RakeshS Я ищу регистрацию на стороне сервера google+ для своего приложения - person user2330998; 29.04.2013
comment
Кто-нибудь, помогите мне. я ищу помощь - person user2330998; 29.04.2013
comment
Ссылка, предоставленная вами, не очень полезна для меня. я ищу developers.google.com/+/web/signin/ поток на стороне сервера. тип зарегистрироваться - person user2330998; 29.04.2013
comment
эй, спасибо за помощь, но я ищу регистрацию с помощью кнопки google+, как в Developers.google.com/+/web/signin - person user2330998; 30.04.2013
comment
Я думал, что уже дал объяснение в приведенном выше ответе с обновлением. Используйте API-интерфейс информации о пользователе, чтобы получить данные пользователя из учетной записи Google и сохранить их в своих таблицах. - person Rakesh Sankar; 30.04.2013
comment
Я использовал API информации о пользователе, но проблема в том, что я хочу включить в свое приложение кнопку регистрации Google+ вместо простой ссылки. - person user2330998; 30.04.2013
comment
Это то, что вы ищете?? - person Rakesh Sankar; 30.04.2013
comment
Я ищу регистрацию на стороне сервера google+ с помощью кнопки google+, и после регистрации я хочу сохранить данные в БД. Я должен делать все эти вещи в Yii framework - person user2330998; 30.04.2013
comment
Привет, RakeshS, я ищу поток на стороне сервера - person user2330998; 30.04.2013
comment
Посетите любой внештатный веб-сайт и заплатите им за код, вам нужен весь код. Если да, то это не то место, это только для тех, кто застрял на проблеме и некуда больше пойти, чтобы завершить решение. - person Rakesh Sankar; 30.04.2013
comment
эй, я не ищу весь код. Я ищу, какой файл библиотеки я должен использовать, потому что в клиентской библиотеке Google API много файлов, и как я могу настроить кнопку google+ - person user2330998; 30.04.2013