AuthorizationsController.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Requests\Api\AuthorizationRequest;
  4. use Illuminate\Http\Request;
  5. # use App\Http\Controllers\Controller;
  6. use Illuminate\Support\Facades\Auth;
  7. class AuthorizationsController extends Controller
  8. {
  9. public function __construct()
  10. {
  11. // 这里额外注意了:官方文档样例中只除外了『login』
  12. // 这样的结果是,token 只能在有效期以内进行刷新,过期无法刷新
  13. // 如果把 refresh 也放进去,token 即使过期但仍在刷新期以内也可刷新
  14. // 不过刷新一次作废
  15. $this->middleware('auth:api', ['except' => ['login']]);
  16. // 另外关于上面的中间件,官方文档写的是『auth:api』
  17. // 但是我推荐用 『jwt.auth』,效果是一样的,但是有更加丰富的报错信息返回
  18. }
  19. // api 登录
  20. public function login(AuthorizationRequest $request)
  21. {
  22. $credentials = [
  23. 'email' => $request->email,
  24. 'password' => $request->password,
  25. ];
  26. if (! $token = Auth::guard('api')->attempt($credentials)) {
  27. // return response()->json(['error' => 'Unauthorized'], 401);
  28. return $this->errorUnauthorized('用户名或密码错误');
  29. }
  30. return $this->respondWithToken($token);
  31. }
  32. /**
  33. * Get the authenticated User.
  34. *
  35. * @return \Illuminate\Http\JsonResponse
  36. */
  37. public function me()
  38. {
  39. return response()->json(auth('api')->user());
  40. }
  41. // 删除 token
  42. public function logout()
  43. {
  44. Auth::guard('api')->logout();
  45. // return $this->noContent();
  46. return response()->json(['message' => 'Successfully logged out']);
  47. }
  48. /**
  49. * Refresh a token.
  50. * 刷新token,如果开启黑名单,以前的token便会失效。
  51. * 值得注意的是用上面的getToken再获取一次Token并不算做刷新,两次获得的Token是并行的,即两个都可用。
  52. * @return \Illuminate\Http\JsonResponse
  53. */
  54. public function refresh()
  55. {
  56. $token = Auth::guard('api')->refresh();
  57. return $this->respondWithToken($token);
  58. }
  59. // 响应 token
  60. protected function respondWithToken($token)
  61. {
  62. return response([
  63. 'access_token' => $token,
  64. 'token_type' => 'Bearer',
  65. 'expires_in' => Auth::guard('api')->factory()->getTTL() * 60
  66. ], 201);
  67. }
  68. }