title: Google OAuth ,Error 401 invalid client
body: <p>I am trying to login using <strong>google+</strong> .But getting </p>
  
  <blockquote>
    <ol start="401">
    <li>That’s an error.</li>
    </ol>
    
    <p>Error: invalid_client</p>
    
    <p>The OAuth client was not found.
    Request Details</p>
  
  <pre><code>        access_type=offline
          openid.realm=
          scope=https://www.googleapis.com/auth/plus.login
          origin=http://localhost
          response_type=code permission
          redirect_uri=storagerelay://http/localhost?id=auth929840
          ss_domain=http://localhost
          client_id={{ CLIENT_ID }}
  </code></pre>
  </blockquote>
  
  <p>I have double-checked the client id .Help would be appreciated
  I have attached my <code>index.php</code> file.  </p>
  
  <pre><code>         &lt;?php
          /*
  
  
      * Sample application for Google+ client to server authentication.
       * Remember to fill in the OAuth 2.0 client id and client secret,
       * which can be obtained from the Google Developer Console at
       * https://code.google.com/apis/console
       *
       * Copyright 2013 Google Inc.
       *
       * Licensed under the Apache License, Version 2.0 (the "License");
       * you may not use this file except in compliance with the License.
       * You may obtain a copy of the License at
       *
       *     http://www.apache.org/licenses/LICENSE-2.0
       *
       * Unless required by applicable law or agreed to in writing, software
       * distributed under the License is distributed on an "AS IS" BASIS,
       * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       * See the License for the specific language governing permissions and
       * limitations under the License.
       */
  
      /*
       * Note (Gerwin Sturm):
       * Include path is still necessary despite autoloading because of the require_once in the libary
       * Client library should be fixed to have correct relative paths
       * e.g. require_once '../Google/Model.php'; instead of require_once 'Google/Model.php';
       */
      set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ .'/vendor/google/apiclient/src');
  
      require_once __DIR__.'/vendor/autoload.php';
  
      use Symfony\Component\HttpFoundation\Request;
      use Symfony\Component\HttpFoundation\Response;
  
      /**
       * Simple server to demonstrate how to use Google+ Sign-In and make a request
       * via your own server.
       *
       * @author silvano@google.com (Silvano Luciani)
       */
  
      /**
       * Replace this with the client ID you got from the Google APIs console.
       */
      const CLIENT_ID = 'XXXXXXXX-itqqmr9qhegol91ne7sgkkeksmncfgqp.apps.googleusercontent.com';
  
      /**
       * Replace this with the client secret you got from the Google APIs console.
       */
      const CLIENT_SECRET = 'XXXXXXXXXXX';
  
      /**
       * Optionally replace this with your application's name.
       */
      const APPLICATION_NAME = "CoachGator";
  
      $client = new Google_Client();
      $client-&gt;setApplicationName(APPLICATION_NAME);
      $client-&gt;setClientId(CLIENT_ID);
      $client-&gt;setClientSecret(CLIENT_SECRET);
      $client-&gt;setRedirectUri('postmessage');
  
      $plus = new Google_Service_Plus($client);
  
      $app = new Silex\Application();
      $app['debug'] = true;
  
      $app-&gt;register(new Silex\Provider\TwigServiceProvider(), array(
          'twig.path' =&gt; __DIR__,
      ));
      $app-&gt;register(new Silex\Provider\SessionServiceProvider());
  
      // Initialize a session for the current user, and render index.html.
      $app-&gt;get('/', function () use ($app) {
          $state = md5(rand());
          $app['session']-&gt;set('state', $state);
          return $app['twig']-&gt;render('index.html', array(
              'CLIENT_ID' =&gt; CLIENT_ID,
              'STATE' =&gt; $state,
              'APPLICATION_NAME' =&gt; APPLICATION_NAME
          ));
      });
  
      // Upgrade given auth code to token, and store it in the session.
      // POST body of request should be the authorization code.
      // Example URI: /connect?state=...&amp;gplus_id=...
      $app-&gt;post('/connect', function (Request $request) use ($app, $client) {
          $token = $app['session']-&gt;get('token');
  
          if (empty($token)) {
              // 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-&gt;get('state') != ($app['session']-&gt;get('state'))) {
                  return new Response('Invalid state parameter', 401);
              }
  
              // Normally the state would be a one-time use token, however in our
              // simple case, we want a user to be able to connect and disconnect
              // without reloading the page.  Thus, for demonstration, we don't
              // implement this best practice.
              //$app['session']-&gt;set('state', '');
  
              $code = $request-&gt;getContent();
              // Exchange the OAuth 2.0 authorization code for user credentials.
              $client-&gt;authenticate($code);
              $token = json_decode($client-&gt;getAccessToken());
  
              // You can read the Google user ID in the ID token.
              // "sub" represents the ID token subscriber which in our case
              // is the user ID. This sample does not use the user ID.
              $attributes = $client-&gt;verifyIdToken($token-&gt;id_token, CLIENT_ID)
                  -&gt;getAttributes();
              $gplus_id = $attributes["payload"]["sub"];
  
              // Store the token in the session for later use.
              $app['session']-&gt;set('token', json_encode($token));
              $response = 'Successfully connected with token: ' . print_r($token, true);
          } else {
              $response = 'Already connected';
          }
  
          return new Response($response, 200);
      });
  
      // Get list of people user has shared with this app.
      $app-&gt;get('/people', function () use ($app, $client, $plus) {
          $token = $app['session']-&gt;get('token');
  
          if (empty($token)) {
              return new Response('Unauthorized request', 401);
          }
  
          $client-&gt;setAccessToken($token);
          $people = $plus-&gt;people-&gt;listPeople('me', 'visible', array());
  
          /*
           * Note (Gerwin Sturm):
           * $app-&gt;json($people) ignores the $people-&gt;items not returning this array
           * Probably needs to be fixed in the Client Library
           * items isn't listed as public property in Google_Service_Plus_Person
           * Using -&gt;toSimpleObject for now to get a JSON-convertible object
           */
          return $app-&gt;json($people-&gt;toSimpleObject());
      });
  
      // Revoke current user's token and reset their session.
      $app-&gt;post('/disconnect', function () use ($app, $client) {
          $token = json_decode($app['session']-&gt;get('token'))-&gt;access_token;
          $client-&gt;revokeToken($token);
          // Remove the credentials from the user's session.
          $app['session']-&gt;set('token', '');
          return new Response('Successfully disconnected', 200);
      });
  
      $app-&gt;run();
  </code></pre>