实现Google Sign-In按钮后无法从JWT解码credential问题求助
问题原因及解决方案
你遇到的错误直接原因是verifyIdToken方法接收到的$id_token为空,可按以下步骤逐一排查修复:
- 首先校验
$id_token是否成功取到值
当你前端提交请求的Content-Type为application/json时,filter_input(INPUT_POST, 'credential')无法获取到参数,你可以先打印$id_token确认是否为空。如果是JSON提交的场景,改用以下方式获取参数:$postData = json_decode(file_get_contents('php://input'), true); $id_token = $postData['credential'] ?? ''; $csrfToken = $postData['g_csrf_token'] ?? ''; g_csrf_token必须做校验
这个参数是Google用来防范CSRF攻击的,使用前需要先和用户Cookie中存储的g_csrf_token做一致性对比,不一致直接拒绝请求:$cookieCsrf = $_COOKIE['g_csrf_token'] ?? ''; if ($csrfToken !== $cookieCsrf || empty($csrfToken)) { die('CSRF校验失败'); }- 修正Google Client初始化逻辑
不需要额外加addScope配置,确认传入的$clientid和前端初始化Google登录按钮时使用的客户端ID完全一致即可,修正后的验证逻辑如下:$client = new Google_Client(['client_id' => $clientid]); try { $payload = $client->verifyIdToken($id_token); if ($payload) { // 验证通过,可拿取用户信息:$payload['sub']是用户唯一标识,$payload['email']是用户邮箱等 $userid = $payload['sub']; } else { $errorMessage = "ID Token无效"; } } catch(Exception $ex) { $errorMessage = "Error in verifyIdToken():" . $ex->getMessage(); } - 可选校验:如果以上步骤都完成还是报错,确认你的Google API Client是通过composer正确安装引入的,没有类加载异常,同时
$clientid变量已经正确赋值,没有拼写错误。
内容的提问来源于stack exchange,提问作者xgretsch
相关产品推荐
相关产品推荐

