AuthController.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. <?php
  2. namespace App\Module\OpenAPI\Controllers;
  3. use App\Module\OpenAPI\Services\AuthService;
  4. use App\Module\OpenAPI\Services\OpenApiService;
  5. use App\Module\OpenAPI\Validators\AuthValidator;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Http\JsonResponse;
  8. /**
  9. * 认证控制器
  10. */
  11. class AuthController
  12. {
  13. /**
  14. * @var AuthService
  15. */
  16. protected AuthService $authService;
  17. /**
  18. * @var OpenApiService
  19. */
  20. protected OpenApiService $openApiService;
  21. /**
  22. * @var AuthValidator
  23. */
  24. protected AuthValidator $authValidator;
  25. public function __construct(
  26. AuthService $authService,
  27. OpenApiService $openApiService,
  28. AuthValidator $authValidator
  29. ) {
  30. $this->authService = $authService;
  31. $this->openApiService = $openApiService;
  32. $this->authValidator = $authValidator;
  33. }
  34. /**
  35. * 获取访问令牌
  36. *
  37. * @param Request $request
  38. * @return JsonResponse
  39. */
  40. public function token(Request $request): JsonResponse
  41. {
  42. try {
  43. // 验证请求参数
  44. $validation = $this->authValidator->validateTokenRequest($request->all());
  45. if (!$validation['success']) {
  46. return $this->errorResponse('参数验证失败', $validation['errors'], 400);
  47. }
  48. $grantType = $request->input('grant_type');
  49. switch ($grantType) {
  50. case 'client_credentials':
  51. return $this->handleClientCredentials($request);
  52. case 'authorization_code':
  53. return $this->handleAuthorizationCode($request);
  54. case 'refresh_token':
  55. return $this->handleRefreshToken($request);
  56. default:
  57. return $this->errorResponse('不支持的授权类型', [], 400);
  58. }
  59. } catch (\Exception $e) {
  60. return $this->errorResponse('获取令牌失败', ['message' => $e->getMessage()], 500);
  61. }
  62. }
  63. /**
  64. * 处理客户端凭证授权
  65. *
  66. * @param Request $request
  67. * @return JsonResponse
  68. */
  69. protected function handleClientCredentials(Request $request): JsonResponse
  70. {
  71. $appId = $request->input('client_id');
  72. $appSecret = $request->input('client_secret');
  73. $scopes = explode(' ', $request->input('scope', ''));
  74. // 验证应用
  75. $app = $this->openApiService->validateApp($appId, $appSecret);
  76. if (!$app) {
  77. return $this->errorResponse('应用认证失败', [], 401);
  78. }
  79. // 检查权限范围
  80. foreach ($scopes as $scope) {
  81. if (!$this->openApiService->checkScope($app, $scope)) {
  82. return $this->errorResponse('权限不足', ['scope' => $scope], 403);
  83. }
  84. }
  85. // 生成访问令牌
  86. $tokenData = $this->authService->generateAccessToken($app, 0, $scopes);
  87. return $this->successResponse('令牌获取成功', $tokenData);
  88. }
  89. /**
  90. * 处理授权码授权
  91. *
  92. * @param Request $request
  93. * @return JsonResponse
  94. */
  95. protected function handleAuthorizationCode(Request $request): JsonResponse
  96. {
  97. $appId = $request->input('client_id');
  98. $appSecret = $request->input('client_secret');
  99. $code = $request->input('code');
  100. // 验证应用
  101. $app = $this->openApiService->validateApp($appId, $appSecret);
  102. if (!$app) {
  103. return $this->errorResponse('应用认证失败', [], 401);
  104. }
  105. // 验证授权码
  106. $codeData = $this->authService->validateAuthCode($code, $appId);
  107. if (!$codeData) {
  108. return $this->errorResponse('授权码无效', [], 400);
  109. }
  110. // 生成访问令牌
  111. $tokenData = $this->authService->generateAccessToken(
  112. $app,
  113. $codeData['user_id'],
  114. $codeData['scopes']
  115. );
  116. return $this->successResponse('令牌获取成功', $tokenData);
  117. }
  118. /**
  119. * 处理刷新令牌
  120. *
  121. * @param Request $request
  122. * @return JsonResponse
  123. */
  124. protected function handleRefreshToken(Request $request): JsonResponse
  125. {
  126. $refreshToken = $request->input('refresh_token');
  127. // 刷新访问令牌
  128. $tokenData = $this->authService->refreshAccessToken($refreshToken);
  129. if (!$tokenData) {
  130. return $this->errorResponse('刷新令牌无效', [], 400);
  131. }
  132. return $this->successResponse('令牌刷新成功', $tokenData);
  133. }
  134. /**
  135. * 刷新令牌
  136. *
  137. * @param Request $request
  138. * @return JsonResponse
  139. */
  140. public function refresh(Request $request): JsonResponse
  141. {
  142. try {
  143. $refreshToken = $request->input('refresh_token');
  144. if (!$refreshToken) {
  145. return $this->errorResponse('缺少刷新令牌', [], 400);
  146. }
  147. $tokenData = $this->authService->refreshAccessToken($refreshToken);
  148. if (!$tokenData) {
  149. return $this->errorResponse('刷新令牌无效', [], 400);
  150. }
  151. return $this->successResponse('令牌刷新成功', $tokenData);
  152. } catch (\Exception $e) {
  153. return $this->errorResponse('刷新令牌失败', ['message' => $e->getMessage()], 500);
  154. }
  155. }
  156. /**
  157. * 撤销令牌
  158. *
  159. * @param Request $request
  160. * @return JsonResponse
  161. */
  162. public function revoke(Request $request): JsonResponse
  163. {
  164. try {
  165. $token = $request->input('token');
  166. $tokenTypeHint = $request->input('token_type_hint', 'access_token');
  167. if (!$token) {
  168. return $this->errorResponse('缺少令牌', [], 400);
  169. }
  170. // 这里可以实现令牌撤销逻辑
  171. // 暂时返回成功响应
  172. return $this->successResponse('令牌已撤销');
  173. } catch (\Exception $e) {
  174. return $this->errorResponse('撤销令牌失败', ['message' => $e->getMessage()], 500);
  175. }
  176. }
  177. /**
  178. * 生成JWT令牌
  179. *
  180. * @param Request $request
  181. * @return JsonResponse
  182. */
  183. public function jwt(Request $request): JsonResponse
  184. {
  185. try {
  186. $appId = $request->input('app_id');
  187. $appSecret = $request->input('app_secret');
  188. // 验证应用
  189. $app = $this->openApiService->validateApp($appId, $appSecret);
  190. if (!$app) {
  191. return $this->errorResponse('应用认证失败', [], 401);
  192. }
  193. // 生成JWT令牌
  194. $payload = [
  195. 'user_id' => $request->input('user_id', 0),
  196. 'scopes' => $app->scopes,
  197. ];
  198. $token = $this->authService->generateJwtToken($app, $payload);
  199. return $this->successResponse('JWT令牌生成成功', [
  200. 'token' => $token,
  201. 'token_type' => 'Bearer',
  202. 'expires_in' => config('openapi.auth.jwt.expire', 3600),
  203. ]);
  204. } catch (\Exception $e) {
  205. return $this->errorResponse('生成JWT令牌失败', ['message' => $e->getMessage()], 500);
  206. }
  207. }
  208. /**
  209. * 验证JWT令牌
  210. *
  211. * @param Request $request
  212. * @return JsonResponse
  213. */
  214. public function verifyJwt(Request $request): JsonResponse
  215. {
  216. try {
  217. $token = $request->input('token');
  218. if (!$token) {
  219. return $this->errorResponse('缺少令牌', [], 400);
  220. }
  221. $payload = $this->authService->validateJwtToken($token);
  222. if (!$payload) {
  223. return $this->errorResponse('令牌无效', [], 401);
  224. }
  225. return $this->successResponse('令牌验证成功', $payload);
  226. } catch (\Exception $e) {
  227. return $this->errorResponse('验证令牌失败', ['message' => $e->getMessage()], 500);
  228. }
  229. }
  230. /**
  231. * 返回成功响应
  232. *
  233. * @param string $message
  234. * @param array $data
  235. * @return JsonResponse
  236. */
  237. protected function successResponse(string $message, array $data = []): JsonResponse
  238. {
  239. return response()->json([
  240. 'success' => true,
  241. 'message' => $message,
  242. 'data' => $data,
  243. 'timestamp' => time(),
  244. ]);
  245. }
  246. /**
  247. * 返回错误响应
  248. *
  249. * @param string $message
  250. * @param array $errors
  251. * @param int $code
  252. * @return JsonResponse
  253. */
  254. protected function errorResponse(string $message, array $errors = [], int $code = 400): JsonResponse
  255. {
  256. return response()->json([
  257. 'success' => false,
  258. 'message' => $message,
  259. 'errors' => $errors,
  260. 'timestamp' => time(),
  261. ], $code);
  262. }
  263. }