AuthController.php 3.4 KB

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