谷歌登录PHP后端和JS前端

时间:2014-05-13 20:39:02

标签: google-plus google-login

前端是100%JS。用户点击登录按钮,收到authResult['code']并通过ajax发送到localhost/api/user/login,其中包含以下内容:

     $code = $data['code'];
    require_once 'Google/Client.php';
    $client = new Google_Client();
    $client->setClientId('xxxxxx');
    $client->setClientSecret('xxxxx');
    $client->setRedirectUri('http://localhost:8080');
    $client->setScopes('email'); //Why do I need this? I already set scope in JS.
    $client->authenticate($code);   //It fails here. with no error. just 400 bad request.
    $token = json_decode($client->getAccessToken());
    $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());

   //Check errors. 
   //Save user personal info in database
   //Set login sessions
  1. 如果我已经在javascript中设置了范围,为什么还需要设置范围?
  2. 为什么在调用身份验证函数时失败?我没有错误。
  3. 为什么我在后端需要setRedirectUri()?

1 个答案:

答案 0 :(得分:0)

  1. 在这种情况下,您无需设置范围。
  2. (参见答案3,但也):检查您的客户端ID是否与Javascript中使用的客户端ID相匹配,并且客户端密钥与控制台中的完全相同(没有尾随/前导空格)。
  3. 将redirecturi更改为“postmessage” - 这是通过Javascript进程生成代码时使用的字符串。
  4. 您还可以尝试手动构建网址并使用curl调用它,以确保所有内容符合您的预期:https://developers.google.com/accounts/docs/OAuth2WebServer#handlingtheresponse