这是CaiYouHui前端,一个关于flutter的安卓app,前端使用flutter实现

auth_repository.dart 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. import 'dart:convert';
  2. import 'package:shared_preferences/shared_preferences.dart';
  3. import '../../core/constants/api_constants.dart';
  4. import '../../core/utils/crypto_utils.dart';
  5. import '../datasources/remote/api_client.dart';
  6. import '../models/auth/secure_login_request.dart';
  7. import '../models/user.dart';
  8. import '../models/auth/login_request.dart';
  9. import '../models/auth/register_request.dart';
  10. import '../models/auth/token_response.dart';
  11. import '../models/api_response.dart';
  12. class AuthRepository {
  13. final ApiClient _apiClient;
  14. final SharedPreferences _prefs;
  15. AuthRepository({
  16. required ApiClient apiClient,
  17. required SharedPreferences prefs,
  18. }) : _apiClient = apiClient, _prefs = prefs;
  19. // 登录(需要使用安全登录替代)
  20. Future<ApiResponse<User>> login(LoginRequest request) async {
  21. try {
  22. final response = await _apiClient.post(
  23. ApiConstants.getLoginUrl(),
  24. request.toJson(),
  25. withAuth: false,
  26. );
  27. if (response.statusCode == 200) {
  28. final tokenResponse = TokenResponse.fromJson(
  29. json.decode(response.body)
  30. );
  31. // 保存token
  32. await _apiClient.saveToken(tokenResponse.accessToken);
  33. return ApiResponse<User>(
  34. success: true,
  35. message: '登录成功',
  36. data: tokenResponse.user,
  37. );
  38. } else {
  39. final error = json.decode(response.body);
  40. return ApiResponse<User>(
  41. success: false,
  42. message: error['detail'] ?? '登录失败',
  43. );
  44. }
  45. } catch (e) {
  46. return ApiResponse<User>(
  47. success: false,
  48. message: '登录失败: $e',
  49. );
  50. }
  51. }
  52. // 注册(需要使用安全注册替代)
  53. Future<ApiResponse<User>> register(RegisterRequest request) async {
  54. try {
  55. final response = await _apiClient.post(
  56. ApiConstants.getRegisterUrl(),
  57. request.toJson(),
  58. withAuth: false,
  59. );
  60. if (response.statusCode == 201) {
  61. final tokenResponse = TokenResponse.fromJson(
  62. json.decode(response.body)
  63. );
  64. // 保存token
  65. await _apiClient.saveToken(tokenResponse.accessToken);
  66. return ApiResponse<User>(
  67. success: true,
  68. message: '注册成功',
  69. data: tokenResponse.user,
  70. );
  71. } else {
  72. final error = json.decode(response.body);
  73. return ApiResponse<User>(
  74. success: false,
  75. message: error['detail'] ?? '注册失败',
  76. );
  77. }
  78. } catch (e) {
  79. return ApiResponse<User>(
  80. success: false,
  81. message: '注册失败: $e',
  82. );
  83. }
  84. }
  85. // 安全登录方法
  86. Future<ApiResponse<User>> secureLogin(LoginRequest request) async {
  87. try {
  88. // 创建安全登录请求
  89. final secureRequest = SecureLoginRequest.create(
  90. username: request.username,
  91. password: request.password,
  92. );
  93. print(ApiConstants.getLoginUrl());
  94. print(secureRequest.toJson());
  95. final response = await _apiClient.post(
  96. ApiConstants.getLoginUrl(),
  97. secureRequest.toJson(),
  98. withAuth: false,
  99. );
  100. print(response.statusCode);
  101. // ... 处理响应
  102. if (response.statusCode == 200) {
  103. final tokenResponse = TokenResponse.fromJson(
  104. json.decode(response.body)
  105. );
  106. // 保存token
  107. await _apiClient.saveToken(tokenResponse.accessToken);
  108. return ApiResponse<User>(
  109. success: true,
  110. message: '登录成功',
  111. data: tokenResponse.user,
  112. );
  113. } else {
  114. final error = json.decode(response.body);
  115. return ApiResponse<User>(
  116. success: false,
  117. message: error['detail'] ?? '登录失败',
  118. );
  119. }
  120. } catch (e) {
  121. return ApiResponse<User>(
  122. success: false,
  123. message: '登录失败: $e',
  124. );
  125. }
  126. }
  127. // 安全注册方法
  128. Future<ApiResponse<User>> secureRegister(RegisterRequest request) async {
  129. try {
  130. // 创建安全注册数据
  131. final salt = CryptoUtils.generateSalt();
  132. final passwordHash = CryptoUtils.sha256Hash(request.password + salt);
  133. final registerData = {
  134. 'username': request.username,
  135. 'email': request.email,
  136. 'password_hash': passwordHash,
  137. 'salt': salt,
  138. 'full_name': request.fullName,
  139. 'password_confirm': request.passwordConfirm,
  140. };
  141. final response = await _apiClient.post(
  142. ApiConstants.getRegisterUrl(),
  143. registerData,
  144. withAuth: false,
  145. );
  146. // ... 处理响应
  147. if (response.statusCode == 201) {
  148. final tokenResponse = TokenResponse.fromJson(
  149. json.decode(response.body)
  150. );
  151. // 保存token
  152. await _apiClient.saveToken(tokenResponse.accessToken);
  153. return ApiResponse<User>(
  154. success: true,
  155. message: '注册成功',
  156. data: tokenResponse.user,
  157. );
  158. } else {
  159. final error = json.decode(response.body);
  160. return ApiResponse<User>(
  161. success: false,
  162. message: error['detail'] ?? '注册失败',
  163. );
  164. }
  165. } catch (e) {
  166. return ApiResponse<User>(
  167. success: false,
  168. message: '注册失败: $e',
  169. );
  170. }
  171. }
  172. // 获取当前用户
  173. Future<ApiResponse<User>> getCurrentUser() async {
  174. try {
  175. final response = await _apiClient.get(
  176. ApiConstants.getCurrentUserUrl(),
  177. withAuth: true,
  178. );
  179. if (response.statusCode == 200) {
  180. final userData = json.decode(response.body);
  181. return ApiResponse<User>(
  182. success: true,
  183. message: '获取成功',
  184. data: User.fromJson(userData),
  185. );
  186. } else {
  187. return ApiResponse<User>(
  188. success: false,
  189. message: '获取用户信息失败',
  190. );
  191. }
  192. } catch (e) {
  193. return ApiResponse<User>(
  194. success: false,
  195. message: '获取失败: $e',
  196. );
  197. }
  198. }
  199. // 登出
  200. Future<bool> logout() async {
  201. try {
  202. final response = await _apiClient.post(
  203. ApiConstants.getLogoutUrl(),
  204. {},
  205. withAuth: true,
  206. );
  207. if (response.statusCode == 200) {
  208. await _apiClient.clearToken();
  209. return true;
  210. }
  211. return false;
  212. } catch (e) {
  213. return false;
  214. }
  215. }
  216. // 检查登录状态
  217. Future<bool> isLoggedIn() async {
  218. return _apiClient.isLoggedIn();
  219. }
  220. }