totp.dart 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import 'package:auth_totp/auth_totp.dart';
  2. /// otpauth://totp/{}?secret={}&issuer={}
  3. class Totp {
  4. /// for persistent
  5. final String uri;
  6. final String issuer;
  7. final String secret;
  8. final int interval;
  9. Totp({
  10. required this.uri,
  11. required this.issuer,
  12. required this.secret,
  13. required this.interval,
  14. });
  15. String get now => AuthTOTP.generateTOTPCode(
  16. secretKey: secret,
  17. interval: interval,
  18. );
  19. static Totp? fromUri(String uri) {
  20. final totpUri = Uri.tryParse(uri);
  21. if (totpUri == null) return null;
  22. final query = totpUri.queryParameters;
  23. final secret = query["secret"];
  24. if (secret == null) return null;
  25. // final digit = query["digits"];
  26. final period = query["period"];
  27. final issuerQuery = query["issuer"];
  28. final lastPathSeg = totpUri.pathSegments.lastOrNull;
  29. final colonPos = lastPathSeg?.indexOf(":");
  30. final account = colonPos == null
  31. ? null
  32. : colonPos == -1
  33. ? lastPathSeg!
  34. : lastPathSeg!.substring(colonPos + 1);
  35. final issuer = issuerQuery == null
  36. ? lastPathSeg ?? "UNKNOWN"
  37. : "$issuerQuery${account == null ? "" : ":$account"}";
  38. return Totp(
  39. uri: uri,
  40. issuer: issuer,
  41. secret: secret,
  42. interval: period == null ? 30 : int.tryParse(period) ?? 30,
  43. );
  44. }
  45. }