AuthController.php 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace App\Http\Controllers\api\procurement\wechat;
  3. use App\UserDetail;
  4. use Illuminate\Support\Facades\Auth;
  5. use App\Http\Controllers\Controller;
  6. class AuthController extends Controller
  7. {
  8. /**
  9. * Create a new AuthController instance.
  10. * 要求附带email和password(数据来源users表)
  11. *
  12. * @return void
  13. */
  14. public function __construct()
  15. {
  16. // 这里额外注意了:官方文档样例中只除外了『login』
  17. // 这样的结果是,token 只能在有效期以内进行刷新,过期无法刷新
  18. // 如果把 refresh 也放进去,token 即使过期但仍在刷新期以内也可刷新
  19. // 不过刷新一次作废
  20. $this->middleware('auth:api', ['except' => ['login']]);
  21. // 另外关于上面的中间件,官方文档写的是『auth:api』
  22. // 但是我推荐用 『jwt.auth』,效果是一样的,但是有更加丰富的报错信息返回
  23. }
  24. /**
  25. * Get a JWT via given credentials.
  26. *
  27. * @return \Illuminate\Http\JsonResponse
  28. */
  29. public function login()
  30. {
  31. $phone=request('phone');
  32. $user_id=UserDetail::query()->where('mobile_phone',$phone)->value('user_id');
  33. $credentials = [
  34. 'id'=>$user_id,
  35. 'password'=>request('password')
  36. ];
  37. if (! $token = auth('api')->attempt($credentials)) {
  38. return response()->json(['error' => '很抱歉,您的手机号和密码不匹配'], 401);
  39. }
  40. return $this->respondWithToken($token);
  41. }
  42. /**
  43. * Get the authenticated User.
  44. *
  45. * @return \Illuminate\Http\JsonResponse
  46. */
  47. public function me()
  48. {
  49. return response()->json(auth('api')->user());
  50. }
  51. /**
  52. * Log the user out (Invalidate the token).
  53. *
  54. * @return \Illuminate\Http\JsonResponse
  55. */
  56. public function logout()
  57. {
  58. auth('api')->logout();
  59. return response()->json(['message' => 'Successfully logged out']);
  60. }
  61. /**
  62. * Refresh a token.
  63. * 刷新token,如果开启黑名单,以前的token便会失效。
  64. * 值得注意的是用上面的getToken再获取一次Token并不算做刷新,两次获得的Token是并行的,即两个都可用。
  65. * @return \Illuminate\Http\JsonResponse
  66. */
  67. public function refresh()
  68. {
  69. return $this->respondWithToken(auth('api')->refresh());
  70. }
  71. /**
  72. * Get the token array structure.
  73. *
  74. * @param string $token
  75. *
  76. * @return \Illuminate\Http\JsonResponse
  77. */
  78. protected function respondWithToken($token)
  79. {
  80. return response()->json([
  81. 'access_token' => $token,
  82. 'token_type' => 'bearer',
  83. 'expires_in' => auth('api')->factory()->getTTL() * 60
  84. ]);
  85. }
  86. }