javascript - 谷歌客户端API使用后端服务器进行身份验证不起作用

标签 javascript php google-app-engine

尝试这个谷歌客户端 API 示例

https://developers.google.com/identity/sign-in/web/backend-auth

我通过 javascript 获取访问 token ,并通过 ajax 将其发布到我的 PHP,下面的 javascript 对象如下。

expires_at
:
1490552860336
expires_in
:
2223
first_issued_at
:
1490549260336
id_token
:
"eyJhbGciOiJSUzI1NiIsImtpZCI6ImRkMDM4NzVmMzkzMTdiZThlNTc0MDBlNmMzMDYzMmFmNTU4YzJkZTQifQ.eyJhenAiOiI5Mjg3MzEzODM5NzQtc3RsdmFyc291cnZoNmdqaDdvbjkwZWwxOGhjOHVrNXYuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI5Mjg3MzEzODM5NzQtc3RsdmFyc291cnZoNmdqaDdvbjkwZWwxOGhjOHVrNXYuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTQ1MTMzNjU2ODMwMzExNzMwOTgiLCJlbWFpbCI6IndoeXRlYXZlbWVjaGFuaWNhbEBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXRfaGFzaCI6IkF2SUZQaHNjVmFNY1htTEdtand6M2ciLCJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiaWF0IjoxNDkwNTQ5MjU2LCJleHAiOjE0OTA1NTI4NTYsIm5hbWUiOiJUcmF2aXMgS2xlaW4iLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDQuZ29vZ2xldXNlcmNvbnRlbnQuY29tLy1BdzlCUjF4YnVBNC9BQUFBQUFBQUFBSS9BQUFBQUFBQUFBQS9BTWNBWWk5b2ZNV1NtcllGc2pTc0xUcFpZZHhkT0FEaGZBL3M5Ni1jL3Bob3RvLmpwZyIsImdpdmVuX25hbWUiOiJUcmF2aXMiLCJmYW1pbHlfbmFtZSI6IktsZWluIiwibG9jYWxlIjoiZW4ifQ.PBcvfMs9_MO9mcHDtGGyb3VbO-O374tHH7w4gWr8ZMpRDYyynY6ZQd5BxRxlh6b__upzxz6gMYQ29yY__zDnEp4_NrkSp7RWQAcoF-JuY8xM1GtDy5IwEFKPxDh9h-9bGoxCx5jgX7-bu2F5Xk6opwZUzoyyYk5BT1xXpBfAe35CJHK_NAzSfrwEX8vU-hIP9C_BjipXptg5Eo3fi3DxPWRVbrzsscV0DDASm9xEi5ilLkUxBwRZN9bk6hgXXgn2Ts7Mo4B7Rue1oyB_rkNJ3RSgH7ylnHrVePiVwJ_15aKwiD64FgcmdLOruLEm9pADoiAodMVNZ6HAElr3MuWG1w"
idpId
:
"google"
login_hint
:
"AJDLj6JimYVJadfBfXai38izEPbdRaSSCtY5FyzYIVQ1IPE2kad13fq5-9Qwkik2AlWx3_Qlco531-R7LVEwcxvs8Xhw0TvrSg"
session_state
:
Object
token_type
:
"Bearer"

我的PHP如下

  require_once 'google-api-php-client-2.1.1/vendor/autoload.php';
            // Get $id_token via HTTPS POST.

            $client = new Google_Client(['client_id' =>'my google client id' ]);
            $payload = $client->verifyIdToken($this->input->post('id_token'));
            if ($payload) {
              $userid = $payload['sub'];
              // If request specified a G Suite domain:
              //$domain = $payload['hd'];
            } else {
              // Invalid ID token
            }

太令人沮丧了,我从来没有幸运地使用过 google API 示例。我似乎无法在网上找到任何东西来让它发挥作用,这已经好几天了。请帮我。我基本上是在寻找一个可以验证并保存在数据库中的 ID 或 token

我被这个函数困住了

$payload = $client->verifyIdToken($this->input->post('id_token'));

屏幕截图显示了抛出错误之前我已经走了多远。

Screen shot of error

我最终选择了这条路

  $q = 'https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=' . $this->input->post('id_token');
            $json = file_get_contents($q);
            $userInfoArray = json_decode($json,true);
            $googleEmail = $userInfoArray['email'];
            $google_id= $userInfoArray['kid'];

我不确定这个 child 是否是用户的唯一 ID,但它一直返回相同的值。

最佳答案

我知道这是一个非常古老的线程,但想在使用新的 Google Identity 服务时分享这个可能的解决方案:

而不是:

$id_token= $_POST['id_token'];
$CLIENT_ID = 'yourclientid......apps.googleusercontent.com';
...

用途:

$id_token= $_POST['credential'];
$CLIENT_ID = 'yourclientid......apps.googleusercontent.com';
$client = new Google_Client(['client_id' => $CLIENT_ID]);
$payload = $client->verifyIdToken($id_token); 
if ($payload) {
  ....
}

希望这有帮助!

关于javascript - 谷歌客户端API使用后端服务器进行身份验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43032641/

相关文章:

php - Jquery .addclass 'Duration' 即使使用 Google Labs 脚本也无法工作?

PHP/MYSQL 平均每一行

php - fatal error : Uncaught Error: Call to a member function bindParam() on string i

php - WordPress 未在本地环境中运行,为 Google 应用引擎开发

python - Google App Engine - 任务队列启动随机任务的时间太长

javascript - 对 DOM、Javascript 事件和 "what' 进行逆向工程”?

javascript - 调试 HTML 动态表时遇到问题

javascript - 使用不同的图标重新渲染标题 - React Native

javascript - 什么是 Angularjs $compile 函数的第二个和第三个参数

python - Google App Engine __main__ 模块