AuthenticationController.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. namespace Webkul\BagistoApi\Http\Controllers;
  3. use Illuminate\Http\JsonResponse;
  4. use Illuminate\Http\Request;
  5. use Tymon\JWTAuth\Exceptions\JWTException;
  6. use Tymon\JWTAuth\Facades\JWTAuth;
  7. /**
  8. * Handles user authentication with JWT Bearer tokens
  9. */
  10. class AuthenticationController extends Controller
  11. {
  12. public function login(Request $request): JsonResponse
  13. {
  14. $credentials = $request->validate([
  15. 'email' => 'required|email',
  16. 'password' => 'required|string|min:6',
  17. ]);
  18. try {
  19. if (! $token = JWTAuth::attempt($credentials)) {
  20. return response()->json([
  21. 'message' => 'Invalid email or password',
  22. 'error' => 'invalid_credentials',
  23. ], 401);
  24. }
  25. $user = JWTAuth::user();
  26. return response()->json([
  27. 'message' => 'Login successful',
  28. 'token' => $token,
  29. 'token_type' => 'Bearer',
  30. 'expires_in' => auth()->factory()->getTTL() * 60, // in seconds
  31. 'user' => [
  32. 'id' => $user->id,
  33. 'email' => $user->email,
  34. 'name' => $user->name,
  35. ],
  36. ], 200);
  37. } catch (JWTException $e) {
  38. return response()->json([
  39. 'message' => 'Token creation failed',
  40. 'error' => 'token_creation_failed',
  41. ], 500);
  42. }
  43. }
  44. public function register(Request $request): JsonResponse
  45. {
  46. $validated = $request->validate([
  47. 'name' => 'required|string|max:255',
  48. 'email' => 'required|email|unique:customers,email',
  49. 'password' => 'required|string|min:6|confirmed',
  50. ]);
  51. try {
  52. $user = User::create([
  53. 'name' => $validated['name'],
  54. 'email' => $validated['email'],
  55. 'password' => bcrypt($validated['password']),
  56. ]);
  57. $token = JWTAuth::fromUser($user);
  58. return response()->json([
  59. 'message' => 'Registration successful',
  60. 'token' => $token,
  61. 'token_type' => 'Bearer',
  62. 'expires_in' => auth()->factory()->getTTL() * 60,
  63. 'user' => [
  64. 'id' => $user->id,
  65. 'email' => $user->email,
  66. 'name' => $user->name,
  67. ],
  68. ], 201);
  69. } catch (JWTException $e) {
  70. return response()->json([
  71. 'message' => 'Registration failed',
  72. 'error' => 'registration_failed',
  73. ], 500);
  74. }
  75. }
  76. public function refreshToken(Request $request): JsonResponse
  77. {
  78. try {
  79. $token = JWTAuth::parseToken()->refresh();
  80. return response()->json([
  81. 'message' => 'Token refreshed',
  82. 'token' => $token,
  83. 'token_type' => 'Bearer',
  84. 'expires_in' => auth()->factory()->getTTL() * 60,
  85. ], 200);
  86. } catch (JWTException $e) {
  87. return response()->json([
  88. 'message' => 'Token refresh failed',
  89. 'error' => 'token_refresh_failed',
  90. ], 401);
  91. }
  92. }
  93. public function logout(Request $request): JsonResponse
  94. {
  95. try {
  96. JWTAuth::parseToken()->invalidate();
  97. return response()->json([
  98. 'message' => 'Logout successful',
  99. ], 200);
  100. } catch (JWTException $e) {
  101. return response()->json([
  102. 'message' => 'Logout failed',
  103. 'error' => 'logout_failed',
  104. ], 500);
  105. }
  106. }
  107. /**
  108. * Get current authenticated user
  109. *
  110. * GET /api/shop/me
  111. *
  112. * Header:
  113. * Authorization: Bearer {token}
  114. */
  115. public function me(Request $request): JsonResponse
  116. {
  117. try {
  118. $user = JWTAuth::parseToken()->authenticate();
  119. return response()->json([
  120. 'user' => $user,
  121. ], 200);
  122. } catch (JWTException $e) {
  123. return response()->json([
  124. 'message' => 'User not found',
  125. 'error' => 'user_not_found',
  126. ], 404);
  127. }
  128. }
  129. }