根本原因是 laravel 的 session 未启动,常见于 api 路由或中间件配置遗漏;web 中间件组默认启用 session,而 api 路由不支持,需确认路由在 web.php、web 中间件含 startsession,或 api 场景改用手动获取 Token。

为什么 Socialite 的 redirect() 没跳转,反而报错 “Session store not available”
根本原因不是 Socialite 写错了,而是 Laravel 的 session 还没启动——常见于 API 路由或中间件配置遗漏。web 中间件组才默认启用 session,而 api 路由默认不带 session、csrf、cookie 支持。
实操建议:
- 确认登录路由注册在
routes/web.php,且没加api前缀或middleware('api') - 检查
app/http/Kernel.php中web中间件组是否包含IlluminateSessionMiddlewareStartSession::class(默认有,但自定义内核时可能删掉) - 如果必须走 API 路由(比如 SPA 前端调用),别硬套 Socialite 的重定向流程;改用
driver()->getAccessTokenResponse(code)手动换 token,后端完成用户绑定
gitHub 登录回调 401:client_id 和 client_secret 明明填对了,为什么验证失败
github OAuth App 的 Authorization callback URL 必须**完全匹配**你发起请求时的回调地址,包括协议、域名、端口、路径,一个斜杠都不能错。本地开发时尤其容易栽在这儿。
实操建议:
- 在 GitHub Settings → Developer settings → OAuth Apps 里,把
Authorization callback URL设为http://localhost:8000/login/github/callback(注意不是/login/github,也不是http://127.0.0.1:8000) - 确保
config/services.php中github配置的client_id和client_secret是从 GitHub 页面复制的原始值,**不要手动换行或加空格** - 如果用了 nginx 反代,确认
X-Forwarded-Proto已设置,否则 Laravel 可能生成http://回调链接,而 GitHub 要求https://
微信网页授权回调拿不到 code,request()->input('code') 总是 NULL
微信不是标准 OAuth2 提供商,它的授权流程分两步:先跳转到微信域名获取 code,再由微信服务器重定向回你的地址,并附上 code 参数。如果你的回调路由没暴露给公网,或域名没在微信公众号后台白名单里,微信压根不会跳回来。
实操建议:
- 确认公众号后台「公众号设置 → 功能设置 → 网页授权域名」已填入你的回调域名(如
example.com),**不能带http://或路径,只填一级或二级域名** - 回调地址必须是 GET 请求,且路由要允许 query 参数透传;避免在中间件里提前 abort 或 redirect
- 微信返回的
code是临时凭证,5 分钟内必须用https://api.weixin.qq.com/sns/oauth2/access_token换取access_token,Socialite 默认不支持这一步,得自己调用微信接口
多个社交平台共存时,config/services.php 怎么避免 key 冲突和环境泄露
不同平台(如微信、GitHub、Google)的 client_id 和 client_secret 各不相同,但都塞进同一个 services.php 容易混,更危险的是把生产密钥提交到 Git。
实操建议:
- 每个平台单独配一个数组项,例如
'wechat' => [...]、'github' => [...],不要全堆在'github'下面 -
client_secret统一用env()加载:'client_secret' => env('WECHAT_CLIENT_SECRET'),并在.env里设值,同时把.env加进.gitignore - 本地开发用测试 App,生产环境在服务器上单独配
.env.production,用APP_ENV=production切换,避免密钥误用
第三方登录真正卡住人的,往往不是代码写法,而是平台侧的配置细节、域名白名单、HTTPS 强制要求这些看不见的链路。填错一个回调 URL,比写错三行 PHP 更难 debug。