authn.service.dart 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import 'dart:io';
  2. import 'package:dio/dio.dart';
  3. import 'package:maxkey_flutter/persistent.dart';
  4. import 'package:maxkey_flutter/utils.dart';
  5. typedef ExpectedErrorHandler = void Function(String msg);
  6. class AuthnService {
  7. final Dio _dio;
  8. AuthnService(this._dio);
  9. /// 获取 state 类型
  10. Future<String?> get() async {
  11. try {
  12. LOGGER.i("GET: /login/get?_allow_anonymous=true");
  13. final res = await _dio.get(
  14. "/login/get?_allow_anonymous=true",
  15. queryParameters: {"remember_me": true},
  16. );
  17. return res.data["data"]["state"];
  18. } catch (err) {
  19. LOGGER.e(err);
  20. }
  21. return null;
  22. }
  23. /// 短信验证码
  24. Future<bool> produceOtp({
  25. required ExpectedErrorHandler expectedErrorHandler,
  26. required String mobile,
  27. }) async {
  28. try {
  29. LOGGER.i("GET: /login/sendotp/$mobile?_allow_anonymous=true");
  30. final res = await _dio.get(
  31. "/login/sendotp/$mobile?_allow_anonymous=true",
  32. queryParameters: {"mobile": mobile},
  33. );
  34. if (res.data["code"] != 0) {
  35. final msg = res.data["message"] ?? "验证码发送失败";
  36. expectedErrorHandler(msg);
  37. LOGGER.w(msg);
  38. return false;
  39. }
  40. return true;
  41. } catch (err) {
  42. LOGGER.e(err);
  43. }
  44. return false;
  45. }
  46. /// 账密登录
  47. Future<bool> loginNormal({
  48. required ExpectedErrorHandler expectedErrorHandler,
  49. required String state,
  50. required String username,
  51. required String password,
  52. required String captcha,
  53. }) async {
  54. try {
  55. LOGGER.i("POST: /login/signin?_allow_anonymous=true");
  56. final res = await _dio.post(
  57. "/login/signin?_allow_anonymous=true",
  58. data: {
  59. "authType": "app",
  60. "state": state,
  61. "username": username,
  62. "password": password,
  63. "captcha": captcha,
  64. "remeberMe": true,
  65. },
  66. );
  67. if (res.data["code"] != 0) {
  68. final msg = res.data["message"] ?? "登陆失败";
  69. expectedErrorHandler(msg);
  70. LOGGER.w(msg);
  71. return false;
  72. }
  73. await onlineAuth(
  74. token: res.data["data"]["token"],
  75. onlineTicket: res.data["data"]["ticket"],
  76. username: res.data["data"]["username"],
  77. );
  78. return true;
  79. } catch (err) {
  80. LOGGER.e(err);
  81. }
  82. return false;
  83. }
  84. Future<bool> scanCode({
  85. required ExpectedErrorHandler expectedErrorHandler,
  86. required String code,
  87. }) async {
  88. final token = MaxKeyPersistent.instance.token;
  89. if (token == null) {
  90. expectedErrorHandler("未登录");
  91. return false;
  92. }
  93. try {
  94. LOGGER.i("POST: /login/scanCode");
  95. final res = await _dio.post(
  96. "/login/scanCode",
  97. data: {"jwtToken": token, "code": code},
  98. );
  99. if (res.data["code"] != 0) {
  100. final msg = res.data["message"] ?? "扫码登陆失败";
  101. expectedErrorHandler(msg);
  102. LOGGER.w(msg);
  103. return false;
  104. }
  105. return true;
  106. } catch (err) {
  107. LOGGER.e(err);
  108. }
  109. return false;
  110. }
  111. Future<void> onlineAuth({
  112. required String token,
  113. required String onlineTicket,
  114. required String username,
  115. }) async {
  116. await MaxKeyPersistent.instance.setUser(username);
  117. await MaxKeyPersistent.instance.setToken(token);
  118. _dio.options.headers[HttpHeaders.authorizationHeader] = token;
  119. }
  120. bool localAuth() {
  121. final token = MaxKeyPersistent.instance.token;
  122. if (token == null) return false;
  123. _dio.options.headers[HttpHeaders.authorizationHeader] = token;
  124. return true;
  125. }
  126. /// 登出并清除本地缓存的 token
  127. Future<void> logout() async {
  128. try {
  129. LOGGER.i("GET: /logout");
  130. await _dio.get("/logout");
  131. } catch (err) {
  132. LOGGER.e(err);
  133. }
  134. _dio.options.headers.remove(HttpHeaders.authorizationHeader);
  135. await MaxKeyPersistent.instance.clearToken();
  136. }
  137. }