123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- import 'dart:io';
- import 'package:dio/dio.dart';
- import 'package:maxkey_flutter/persistent.dart';
- import 'package:maxkey_flutter/utils.dart';
- typedef ExpectedErrorHandler = void Function(String msg);
- class AuthnService {
- final Dio _dio;
- AuthnService(this._dio);
- /// 获取 state 类型
- Future<String?> get() async {
- try {
- LOGGER.i("AuthnService.get(): ");
- LOGGER.i("GET: /login/get?_allow_anonymous=true");
- final res = await _dio.get(
- "/login/get?_allow_anonymous=true",
- queryParameters: {"remember_me": true},
- );
- return res.data["data"]["state"];
- } catch (err) {
- LOGGER.e("AuthnService.get(): ");
- LOGGER.e(err);
- }
- return null;
- }
- /// 短信验证码
- Future<bool> produceOtp({
- required ExpectedErrorHandler expectedErrorHandler,
- required String mobile,
- }) async {
- try {
- LOGGER.i("AuthnService.produceOtp(): ");
- LOGGER.i("GET: /login/sendotp/$mobile?_allow_anonymous=true");
- final res = await _dio.get(
- "/login/sendotp/$mobile?_allow_anonymous=true",
- queryParameters: {"mobile": mobile},
- );
- if (res.data["code"] != 0) {
- final msg = res.data["message"] ?? "验证码发送失败";
- expectedErrorHandler(msg);
- LOGGER.w(msg);
- return false;
- }
- return true;
- } catch (err) {
- LOGGER.e("AuthnService.produceOtp(): ");
- LOGGER.e(err);
- }
- return false;
- }
- /// 账密登录
- Future<bool> loginNormal({
- required ExpectedErrorHandler expectedErrorHandler,
- required String state,
- required String username,
- required String password,
- required String captcha,
- }) async {
- try {
- LOGGER.i("AuthnService.loginNormal(): ");
- LOGGER.i("POST: /login/signin?_allow_anonymous=true");
- final res = await _dio.post(
- "/login/signin?_allow_anonymous=true",
- data: {
- "authType": "app",
- "state": state,
- "username": username,
- "password": password,
- "captcha": captcha,
- "remeberMe": true,
- },
- );
- if (res.data["code"] != 0) {
- final msg = res.data["message"] ?? "登陆失败";
- expectedErrorHandler(msg);
- LOGGER.w(msg);
- return false;
- }
- await onlineAuth(
- token: res.data["data"]["token"],
- onlineTicket: res.data["data"]["ticket"],
- username: res.data["data"]["username"],
- );
- return true;
- } catch (err) {
- LOGGER.e("AuthnService.loginNormal(): ");
- LOGGER.e(err);
- }
- return false;
- }
- Future<bool> scanCode({
- required ExpectedErrorHandler expectedErrorHandler,
- required String code,
- }) async {
- LOGGER.i("AuthnService.scanCode(): ");
- final token = MaxKeyPersistent.instance.token;
- if (token == null) {
- LOGGER.i("未登录");
- expectedErrorHandler("未登录");
- return false;
- }
- try {
- LOGGER.i("POST: /login/scanCode");
- final res = await _dio.post(
- "/login/scanCode",
- data: {"jwtToken": token, "code": code},
- );
- if (res.data["code"] != 0) {
- final msg = res.data["message"] ?? "扫码登陆失败";
- expectedErrorHandler(msg);
- LOGGER.w(msg);
- return false;
- }
- return true;
- } catch (err) {
- LOGGER.e("AuthnService.scanCode(): ");
- LOGGER.e(err);
- }
- return false;
- }
- Future<void> onlineAuth({
- required String token,
- required String onlineTicket,
- required String username,
- }) async {
- await MaxKeyPersistent.instance.setUser(username);
- await MaxKeyPersistent.instance.setToken(token);
- _dio.options.headers[HttpHeaders.authorizationHeader] = token;
- }
- bool localAuth() {
- final token = MaxKeyPersistent.instance.token;
- if (token == null) return false;
- _dio.options.headers[HttpHeaders.authorizationHeader] = token;
- return true;
- }
- /// 登出并清除本地缓存的 token
- Future<void> logout() async {
- try {
- LOGGER.i("AuthnService.logout(): ");
- LOGGER.i("GET: /logout");
- await _dio.get("/logout").timeout(const Duration(seconds: 5));
- } catch (err) {
- LOGGER.e("AuthnService.logout(): ");
- LOGGER.e(err);
- }
- _dio.options.headers.remove(HttpHeaders.authorizationHeader);
- await MaxKeyPersistent.instance.clearToken();
- }
- }
|