Laravel8 Passport API已认证时重复登录如何返回带token的自定义JSON
解决方案核心思路
你当前的重定向逻辑默认面向普通网页端请求,只需要在校验已登录的逻辑分支中,先区分请求类型,针对API类请求单独返回JSON响应即可,具体操作步骤如下:
- 第一步:在身份认证中间件/
authenticated方法的最前端,增加请求类型判断逻辑
优先判断当前请求是否为API请求,常见的判断规则可二选一或者组合校验:- 检查请求头的
Accept字段是否为application/json - 检查路由前缀是否匹配
/api/*这类你预设的API路由规则 - 部分框架自带快捷判断方法,比如Laravel可直接调用
$request->wantsJson(),Django可判断request.content_type == 'application/json'
- 检查请求头的
- 第二步:改写已登录分支的返回逻辑
如果判定为API请求且用户已登录,直接构造JSON响应返回,跳过重定向逻辑,响应体可包含你需要的当前用户token、用户信息等字段。
以下是Laravel框架的参考代码示例:
protected function authenticated(Request $request, $user) { // 优先判断是否为API请求 if ($request->wantsJson()) { return response()->json([ 'code' => 200, 'message' => '已处于登录状态', 'data' => [ // 可根据业务需求选择返回现有有效token或生成新token 'token' => $user->createToken('api-token')->plainTextToken, 'user_info' => $user ] ]); } // 保留原有网页端重定向逻辑 return redirect()->intended($this->redirectPath()); }
额外注意事项
- 你可以根据业务需要选择是复用用户当前有效的未过期token,还是每次请求都重新生成新token返回
- 如果你的API接口要求请求头必须携带
Accept: application/json,要记得在Postman测试时主动加上这个请求头,否则框架可能会判定为普通网页请求,依旧触发重定向逻辑
内容的提问来源于stack exchange,提问作者Kotzilla
相关产品推荐
相关产品推荐

