【发布时间】:2017-06-15 02:03:09
【问题描述】:
我想在 Laravel >=5.2 中使用 this (Tymon JWT-auth) library 进行 JWT 身份验证,但我想将 JWT 令牌放入 HttpOnly Cookies - 以保护 JWT 令牌免受 XSS 攻击。
- 我在项目中设置了 Tymon 库和...删除
'middleware' => 'web'(如果我不这样做,我会看到发布请求的 CSRF 问题)。 - 在 routes.php 我写:
Route::group(['middleware' =>'api', 'prefix' => '/api/v1', 'namespace' => 'Api\V1'], function () { Route::post('/login', 'Auth\AuthController@postLogin'); ... Route::get('/projects', 'ProjectsController@getProjects'); }
-
可能在 Api\V1\Auth\AuthController@postLogin 我生成令牌并将其作为 httpOnly cookie 发送回:
... try { $user = User::where('email','=',$credentials['email'])->first(); if ( !($user && Hash::check($credentials['password'], $user->password) )) { return response()->json(['error' => 'invalid_credentials'], 401); } $customClaims = ['sub' => $user->id, 'role'=> $user->role, 'csrf-token' => str_random(32) ]; $payload = JWTFactory::make($customClaims); $token = JWTAuth::encode($payload); } catch(...) {...} return response()->json($payload->toArray())->withCookie('token', $token, config('jwt.ttl'), "/", null, false, true); -
而且,是的,问题从这里开始。我想对每个请求做一些事情(可能是修改 laravel
Auth类):- 从请求中获取 cookie
- 解码
- 检查是正确的(如果不是 trhow 401)
- 从数据库中获取用户
- 并使该方法 Auth::user() 在 laravel 中以通常的方式在任何地方工作(例如,我可以在每个控制器中使用它)
任何想法如何做第 4 点?
更新
我还在这里添加了对 CSRF 攻击的保护 - csrf-token 在 JWT 中,它也在登录请求的响应体中返回(所以 JS 可以访问这个 csrf-token)(我只返回 JWT 的公共部分登录响应中的令牌,整个 JWT 仅在 cookie 中返回,因此它是 XSS 安全的) - 然后前端 JS 必须将 csrf-token 复制到每个请求的标头中。然后中间件 JWTAuthentiacate(在我下面的回答中)将 csrf-token 标头与 JWT 有效负载中的 csrf-token 字段进行比较 - 如果它们相似,则请求通过 csrf 测试。
【问题讨论】:
-
@Atlas-Pio 那是很久以前的事了,我不记得了 - 2 年来我较少使用 Laravel 而更多地关注前端(Angular) - 但我认为 - 所有信息都在这个问题中- 在我下面的回答中 - 但是如果你有一些具体的问题来设置它 - 创建新的堆栈溢出问题并在评论中给我链接 - 也许我可以提供帮助
标签: api authentication cookies laravel-5 jwt