mirror of
https://gitee.com/dromara/MaxKey.git
synced 2025-12-07 01:18:27 +08:00
56 lines
1.3 KiB
Dart
56 lines
1.3 KiB
Dart
import 'package:auth_totp/auth_totp.dart';
|
|
|
|
/// otpauth://totp/{}?secret={}&issuer={}
|
|
class Totp {
|
|
/// for persistent
|
|
final String uri;
|
|
final String issuer;
|
|
|
|
final String secret;
|
|
final int interval;
|
|
|
|
Totp({
|
|
required this.uri,
|
|
required this.issuer,
|
|
required this.secret,
|
|
required this.interval,
|
|
});
|
|
|
|
String get now => AuthTOTP.generateTOTPCode(
|
|
secretKey: secret,
|
|
interval: interval,
|
|
);
|
|
|
|
static Totp? fromUri(String uri) {
|
|
final totpUri = Uri.tryParse(uri);
|
|
if (totpUri == null) return null;
|
|
|
|
final query = totpUri.queryParameters;
|
|
final secret = query["secret"];
|
|
if (secret == null) return null;
|
|
|
|
// final digit = query["digits"];
|
|
final period = query["period"];
|
|
final issuerQuery = query["issuer"];
|
|
|
|
final lastPathSeg = totpUri.pathSegments.lastOrNull;
|
|
final colonPos = lastPathSeg?.indexOf(":");
|
|
final account = colonPos == null
|
|
? null
|
|
: colonPos == -1
|
|
? lastPathSeg!
|
|
: lastPathSeg!.substring(colonPos + 1);
|
|
|
|
final issuer = issuerQuery == null
|
|
? lastPathSeg ?? "UNKNOWN"
|
|
: "$issuerQuery${account == null ? "" : ":$account"}";
|
|
|
|
return Totp(
|
|
uri: uri,
|
|
issuer: issuer,
|
|
secret: secret,
|
|
interval: period == null ? 30 : int.tryParse(period) ?? 30,
|
|
);
|
|
}
|
|
}
|