Laravel如何通过api.php路由实现API登录与受限内容访问?
别用GET参数传密码!Laravel API认证的正确实现方式
首先得纠正你的误解:直接在GET参数里传邮箱和密码不仅完全不符合这个接口的认证逻辑,而且是极度危险的操作——明文敏感信息会被存在浏览器历史、服务器日志里,等于把账号密码裸奔给所有人看。
你贴的这段Laravel路由代码,用的是auth:api中间件,它默认采用的是令牌(Token)认证机制,完整流程是这样的:
1. 先通过登录接口获取认证令牌
你需要先搭建一个专门的登录接口(用POST请求,避免敏感信息暴露在URL中),用来验证用户的邮箱和密码,并返回一个专属令牌:
use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; Route::post('/api/login', function(Request $request) { // 校验请求参数格式 $credentials = $request->validate([ 'email' => 'required|email', 'password' => 'required' ]); // 验证账号密码是否匹配 if (Auth::attempt($credentials)) { $user = Auth::user(); // 生成可返回给前端的明文API令牌 $token = $user->createToken('MyAPIToken')->plainTextToken; return response()->json(['access_token' => $token]); } // 验证失败返回401未授权 return response()->json(['message' => '账号或密码错误'], 401); });
2. 携带令牌访问受限接口
拿到令牌后,每次请求/get_restricted_content时,需要把令牌放在HTTP请求头里,而不是GET参数中。标准的请求头格式是:
Authorization: Bearer 你的令牌字符串
举个curl请求的实际例子:
curl http://example.loc/api/get_restricted_content \ -H "Authorization: Bearer abcdefghijklmnopqrstuvwxyz123456"
当请求到达服务器时,auth:api中间件会自动解析请求头里的Bearer令牌,验证它的有效性:
- 如果令牌有效,就允许进入路由闭包,返回你看到的那串JSON内容;
- 如果令牌无效、过期或者不存在,直接返回
401 Unauthorized响应。
额外补充
- Laravel的API令牌默认存储在
personal_access_tokens数据表中,你可以通过$user->tokens管理用户的所有令牌,比如手动吊销过期或不再使用的令牌; - 令牌的有效期可以在
config/auth.php的tokens.expiration配置项中设置,默认是长期有效; - 如果你想自定义认证逻辑,也可以扩展
auth:api中间件,但无论如何都不建议用GET参数传密码这种不安全的方式。
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

