Laravel 5.5 可直接用官方 routes/api.php + tymon/jwt-auth 实现稳定 API 开发,无需 Dingo;关键步骤包括:安装 jwt-auth 1.0.0-rc.2、发布配置、执行 jwt:secret、配置 auth.php 的 api guard 为 jwt、用户模型实现 JWTSubject 接口并正确返回主键、路由显式绑定 auth:api 中间件,且响应需用 response()->json() 格式化 token。

直接上手 Laravel 5.5 做 API 开发,不用装 Dingo/API 也能跑通——官方 api.php 路由文件 + JWT 认证已足够稳定可用,关键在配置顺序和中间件绑定是否正确。
api.php 路由自动带前缀且不走 web 中间件
Laravel 5.5 默认把 routes/api.php 的所有路由挂到 /api 下,且自动应用 api 中间件组(定义在 app/Http/Kernel.php 的 $middlewareGroups['api'] 中)。
- 不要手动在路由里写
Route::prefix('api'),否则会变成/api/api/xxx -
api中间件组默认不含session和csrf,适合无状态接口;但也不含auth:api,需显式加 - 若要加版本前缀(如
/api/v1/users),只改Route::prefix('v1')即可,别动全局前缀
tymon/jwt-auth 1.0.0-rc.2 配置必须按顺序执行
这个版本对 Laravel 5.5 兼容性好,但跳过任一环节都会导致 TokenInvalidException 或 JWTException。
- 先运行
composer require tymon/jwt-auth:1.0.0-rc.2,别用^1.0,高版本不兼容 - 再执行
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider",生成config/jwt.php - 必须立刻运行
php artisan jwt:secret,它会在.env写入JWT_SECRET=xxx;漏掉这步 token 签发/验证全失败 -
config/auth.php中的'guards' => ['api' => ['driver' => 'jwt']]必须存在,不能只改defaults.guard
用户模型实现 JWTSubject 接口时字段名要对齐
不是只要 implements 就行,getJWTIdentifier() 返回的字段必须是主键,且数据库中该字段类型要能被 JSON 序列化(比如不能是 UUID 字符串而没做转换)。
-
getJWTIdentifier()应返回$this->getKey()或明确的$this->id,避免用$this->uuid等非整型主键 -
getJWTCustomClaims()返回空数组即可,加额外字段(如'role')需确保值始终存在且非 null,否则签发 token 时会报错 - 模型必须用
use Tymon\JWTAuth\Contracts\JWTSubject;,注意命名空间别写成Tymon\JWTAuth\JWTSubject(少Contracts\)
登录后返回 token 必须用 response()->json() 显式处理
常见错误是直接 return $token 或 return response($token),结果前端收到的是字符串而非标准 JSON 结构。
- 正确写法:
return response()->json(['token' => $token, 'expires_in' => auth()->factory()->getTTL() * 60]) - 别依赖
JWTAuth::fromUser($user)后直接 return,它返回的是字符串,不是响应对象 - 如果用了自定义 guard(如
apijwt),认证时必须显式指定:auth('apijwt')->attempt($credentials),否则仍走默认webguard
最容易被忽略的是:Laravel 5.5 的 api 中间件组默认不加载 throttle:60,1,高频调用接口时不会限流;如需保护,得手动在路由里加 ->middleware('throttle:60,1'),或重写 $middlewareGroups['api']。另外,所有 API 路由都应设 name,方便测试和文档生成,哪怕只是 ->name('api.users.index')。


















