AuthController.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  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 = new \App\Module\OpenAPI\Validations\TokenRequestValidation($request->all());
  45. $validation->validate();
  46. if ($validation->isFail()) {
  47. return $this->errorResponse('参数验证失败', $validation->getErrors(), 400);
  48. }
  49. $data = $validation->getSafeData();
  50. $grantType = $data['grant_type'];
  51. // 根据授权类型处理
  52. switch ($grantType) {
  53. case 'client_credentials':
  54. return $this->handleClientCredentials(
  55. $validation->app,
  56. $validation->scopes ?? []
  57. );
  58. case 'authorization_code':
  59. return $this->handleAuthorizationCode(
  60. $validation->app,
  61. $data['code'],
  62. $validation->scopes ?? []
  63. );
  64. case 'refresh_token':
  65. return $this->handleRefreshToken($data['refresh_token']);
  66. default:
  67. return $this->errorResponse('不支持的授权类型', [], 400);
  68. }
  69. } catch (\Exception $e) {
  70. return $this->errorResponse('获取令牌失败', ['message' => $e->getMessage()], 500);
  71. }
  72. }
  73. /**
  74. * 处理客户端凭证授权
  75. *
  76. * @param \App\Module\OpenAPI\Models\OpenApiApp $app
  77. * @param array $scopes
  78. * @return JsonResponse
  79. */
  80. protected function handleClientCredentials(\App\Module\OpenAPI\Models\OpenApiApp $app, array $scopes): JsonResponse
  81. {
  82. // 生成访问令牌
  83. $tokenData = $this->authService->generateAccessToken($app, 0, $scopes);
  84. return $this->successResponse('令牌获取成功', $tokenData);
  85. }
  86. /**
  87. * 处理授权码授权
  88. *
  89. * @param \App\Module\OpenAPI\Models\OpenApiApp $app
  90. * @param string $code
  91. * @param array $scopes
  92. * @return JsonResponse
  93. */
  94. protected function handleAuthorizationCode(\App\Module\OpenAPI\Models\OpenApiApp $app, string $code, array $scopes): JsonResponse
  95. {
  96. // 验证授权码
  97. $codeData = $this->authService->validateAuthCode($code, $app->app_id);
  98. if (!$codeData) {
  99. return $this->errorResponse('授权码无效', [], 400);
  100. }
  101. // 生成访问令牌
  102. $tokenData = $this->authService->generateAccessToken(
  103. $app,
  104. $codeData['user_id'],
  105. $scopes
  106. );
  107. return $this->successResponse('令牌获取成功', $tokenData);
  108. }
  109. /**
  110. * 处理刷新令牌
  111. *
  112. * @param string $refreshToken
  113. * @return JsonResponse
  114. */
  115. protected function handleRefreshToken(string $refreshToken): JsonResponse
  116. {
  117. // 刷新访问令牌
  118. $tokenData = $this->authService->refreshAccessToken($refreshToken);
  119. if (!$tokenData) {
  120. return $this->errorResponse('刷新令牌无效', [], 400);
  121. }
  122. return $this->successResponse('令牌刷新成功', $tokenData);
  123. }
  124. /**
  125. * 刷新令牌
  126. *
  127. * @param Request $request
  128. * @return JsonResponse
  129. */
  130. public function refresh(Request $request): JsonResponse
  131. {
  132. try {
  133. $refreshToken = $request->input('refresh_token');
  134. if (!$refreshToken) {
  135. return $this->errorResponse('缺少刷新令牌', [], 400);
  136. }
  137. $tokenData = $this->authService->refreshAccessToken($refreshToken);
  138. if (!$tokenData) {
  139. return $this->errorResponse('刷新令牌无效', [], 400);
  140. }
  141. return $this->successResponse('令牌刷新成功', $tokenData);
  142. } catch (\Exception $e) {
  143. return $this->errorResponse('刷新令牌失败', ['message' => $e->getMessage()], 500);
  144. }
  145. }
  146. /**
  147. * 撤销令牌
  148. *
  149. * @param Request $request
  150. * @return JsonResponse
  151. */
  152. public function revoke(Request $request): JsonResponse
  153. {
  154. try {
  155. $token = $request->input('token');
  156. if (!$token) {
  157. return $this->errorResponse('缺少令牌', [], 400);
  158. }
  159. // 这里可以实现令牌撤销逻辑
  160. // 暂时返回成功响应
  161. return $this->successResponse('令牌已撤销');
  162. } catch (\Exception $e) {
  163. return $this->errorResponse('撤销令牌失败', ['message' => $e->getMessage()], 500);
  164. }
  165. }
  166. /**
  167. * 生成JWT令牌
  168. *
  169. * @param Request $request
  170. * @return JsonResponse
  171. */
  172. public function jwt(Request $request): JsonResponse
  173. {
  174. try {
  175. $appId = $request->input('app_id');
  176. $appSecret = $request->input('app_secret');
  177. // 验证应用
  178. $app = $this->openApiService->validateApp($appId, $appSecret);
  179. if (!$app) {
  180. return $this->errorResponse('应用认证失败', [], 401);
  181. }
  182. // 生成JWT令牌
  183. $payload = [
  184. 'user_id' => $request->input('user_id', 0),
  185. 'scopes' => $app->scopes,
  186. ];
  187. $token = $this->authService->generateJwtToken($app, $payload);
  188. return $this->successResponse('JWT令牌生成成功', [
  189. 'token' => $token,
  190. 'token_type' => 'Bearer',
  191. 'expires_in' => config('openapi.auth.jwt.expire', 3600),
  192. ]);
  193. } catch (\Exception $e) {
  194. return $this->errorResponse('生成JWT令牌失败', ['message' => $e->getMessage()], 500);
  195. }
  196. }
  197. /**
  198. * 验证JWT令牌
  199. *
  200. * @param Request $request
  201. * @return JsonResponse
  202. */
  203. public function verifyJwt(Request $request): JsonResponse
  204. {
  205. try {
  206. $token = $request->input('token');
  207. if (!$token) {
  208. return $this->errorResponse('缺少令牌', [], 400);
  209. }
  210. $payload = $this->authService->validateJwtToken($token);
  211. if (!$payload) {
  212. return $this->errorResponse('令牌无效', [], 401);
  213. }
  214. return $this->successResponse('令牌验证成功', $payload);
  215. } catch (\Exception $e) {
  216. return $this->errorResponse('验证令牌失败', ['message' => $e->getMessage()], 500);
  217. }
  218. }
  219. /**
  220. * 返回成功响应
  221. *
  222. * @param string $message
  223. * @param array $data
  224. * @return JsonResponse
  225. */
  226. protected function successResponse(string $message, array $data = []): JsonResponse
  227. {
  228. return response()->json([
  229. 'success' => true,
  230. 'message' => $message,
  231. 'data' => $data,
  232. 'timestamp' => time(),
  233. ]);
  234. }
  235. /**
  236. * 返回错误响应
  237. *
  238. * @param string $message
  239. * @param array $errors
  240. * @param int $code
  241. * @return JsonResponse
  242. */
  243. protected function errorResponse(string $message, array $errors = [], int $code = 400): JsonResponse
  244. {
  245. return response()->json([
  246. 'success' => false,
  247. 'message' => $message,
  248. 'errors' => $errors,
  249. 'timestamp' => time(),
  250. ], $code);
  251. }
  252. }