Laravel 5升级至7版本:如何避免现有令牌被撤销?
解决Laravel升级时令牌失效的问题
首先得明确你使用的令牌类型,不同实现方案的处理方式不同,以下分情况说明:
一、如果使用Laravel Passport
Passport的令牌签名/验证依赖独立的密钥对,而非APP_KEY,这是你仅复制APP_KEY仍失效的核心原因。按以下步骤操作:
- 从旧Laravel 5.8项目中复制
storage/oauth-private.key和storage/oauth-public.key到新项目的storage目录,确保文件权限正确(web服务器需具备读取权限)。 - 不要在新项目执行
php artisan passport:install,否则会生成新的密钥对,直接导致旧令牌失效。 - 完整迁移旧数据库中Passport相关表的数据:
oauth_access_tokens、oauth_refresh_tokens、oauth_clients、oauth_personal_access_clients,这些表记录了令牌的关联信息,缺失会导致验证失败。 - 确保新项目
config/passport.php的配置与旧项目完全一致,比如令牌过期时间、加密算法等参数。
二、如果使用传统API Token(用户表api_token字段)
这种令牌验证逻辑相对简单,排查以下几点:
- 确认旧数据库中用户表的
api_token字段数据已完整迁移到新项目数据库,令牌验证依赖该字段的匹配。 - 检查新项目
config/auth.php中的API守卫配置,确保driver为token,且provider对应的用户表、field参数与旧项目一致,示例配置如下:'guards' => [ 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => false, // 5.8默认未启用哈希,7.x需保持一致 ], ], - 核对
config/hashing.php中的加密驱动,新旧项目需统一为bcrypt(Laravel 5.8和7.x默认都是该驱动)。
三、如果使用第三方JWT扩展(如tymon/jwt-auth)
- 复制旧项目
config/jwt.php中的secret配置到新项目,JWT令牌的验证完全依赖该密钥。 - 确保新旧项目的JWT算法、过期时间等配置一致。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

