使用PHP对接Google登录API时应如何维护会话?
Google Signin 集成会话创建方案说明
两种方案均可行,可根据你的业务需求选择,优先推荐每次登录先完成用户信息的插入/更新操作再创建会话,具体说明如下:
- 如果你仅需要临时校验用户身份、不需要留存用户数据、也无需关联用户的其他业务数据(比如订单、自定义权限、收藏记录等),可以直接基于Google返回的token创建会话。该方案开发成本低,但局限性非常明显:你无法对用户做个性化业务配置,也无法统计用户登录次数、活跃时间等运营数据,且Google的access_token有效期通常只有1小时,过期后你没有本地用户标识,只能强制用户重新走Google授权流程。
- 只要你有任何需要关联用户的业务需求,就必须先做入库操作:使用Google返回的
sub字段(该字段是Google用户的唯一永久标识,比邮箱更稳定,用户可自行修改绑定邮箱但sub不会变)作为唯一键,先查询本地库是否存在对应用户:- 不存在则插入新用户,将邮箱、昵称、头像、
sub值等字段存入数据库 - 存在则更新用户的最新昵称、邮箱、最近登录时间等可能变动的字段
操作完成后把本地用户的ID写入会话即可,后续业务逻辑都基于本地用户ID判断,不受Google token过期的影响。
- 不存在则插入新用户,将邮箱、昵称、头像、
参考补充代码
你可以在原有代码的基础上补充如下逻辑:
// 补充获取Google用户唯一标识 $google_sub = $google_account_info->id; // 此处$db替换为你自己的数据库操作实例 $user = $db->query("SELECT * FROM users WHERE google_sub = ?", [$google_sub])->fetch(); if ($user) { // 已注册用户,更新最新信息与登录时间 $db->query("UPDATE users SET email = ?, name = ?, last_login_at = ? WHERE id = ?", [$email, $name, date('Y-m-d H:i:s'), $user['id']]); $user_id = $user['id']; } else { // 新用户,插入入库 $db->query("INSERT INTO users (google_sub, email, name, created_at, last_login_at) VALUES (?, ?, ?, ?, ?)", [$google_sub, $email, $name, date('Y-m-d H:i:s'), date('Y-m-d H:i:s')]); $user_id = $db->lastInsertId(); } // 会话写入本地用户ID,比单纯存Google access_token实用性更强 $_SESSION['user_id'] = $user_id; // 若无调用Google其他接口的需求,不建议留存access_token,可直接销毁 unset($_SESSION['access_token']);
注意:不要用邮箱作为用户唯一匹配键,Google允许用户修改账号绑定的邮箱,用
sub字段作为唯一键可以避免用户修改邮箱后被系统识别为新用户的问题。
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

