Skip to content

Commit 4436df5

Browse files
authored
fix: use utc for token expiry timestamps #47 (#49)
1 parent 774a299 commit 4436df5

File tree

9 files changed

+22
-15
lines changed

9 files changed

+22
-15
lines changed

packages/clerk_auth/lib/src/clerk_api/api.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ class Api with Logging {
494494

495495
await sessionToken(); // make sure updated
496496

497-
final diff = _tokenCache.sessionTokenExpiry.difference(DateTime.now());
497+
final diff = _tokenCache.sessionTokenExpiry.difference(DateTime.timestamp());
498498
final delay = diff.isNegative ? const Duration(seconds: 55) : diff;
499499
_pollTimer = Timer(delay, _pollForSessionToken);
500500
}

packages/clerk_auth/lib/src/clerk_api/token_cache.dart

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ class TokenCache {
1818
final String _publicKey;
1919
final Persistor _persistor;
2020

21-
DateTime _sessionTokenExpiry = DateTime.fromMillisecondsSinceEpoch(0);
21+
DateTime _sessionTokenExpiry =
22+
DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
2223

2324
/// the date at which, if in the future, the current [sessionToken]
2425
/// is due to expire
@@ -38,7 +39,7 @@ class TokenCache {
3839
clientToken.isNotEmpty && sessionId.isNotEmpty;
3940

4041
bool get _sessionTokenHasExpired =>
41-
DateTime.now().isAfter(sessionTokenExpiry);
42+
DateTime.timestamp().isAfter(sessionTokenExpiry);
4243

4344
String get _sessionIdKey => '_clerkSessionId_${_publicKey.hashCode}';
4445

@@ -67,6 +68,7 @@ class TokenCache {
6768
final milliseconds = await _persistor.read(_sessionTokenExpiryKey) ?? '';
6869
final sessionTokenExpiry = DateTime.fromMillisecondsSinceEpoch(
6970
int.tryParse(milliseconds) ?? 0,
71+
isUtc: true,
7072
);
7173

7274
_sessionId = sessionId;
@@ -81,7 +83,7 @@ class TokenCache {
8183
_sessionId = '';
8284
_clientToken = '';
8385
_sessionToken = '';
84-
_sessionTokenExpiry = DateTime.fromMillisecondsSinceEpoch(0);
86+
_sessionTokenExpiry = DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
8587
for (final key in _persistorKeys) {
8688
_persistor.delete(key);
8789
}
@@ -127,7 +129,9 @@ class TokenCache {
127129
final expirySeconds = jwt.payload['exp'];
128130
if (expirySeconds is int) {
129131
final expiry = DateTime.fromMillisecondsSinceEpoch(
130-
expirySeconds * Duration.millisecondsPerSecond);
132+
expirySeconds * Duration.millisecondsPerSecond,
133+
isUtc: true,
134+
);
131135
_sessionTokenExpiry = expiry.subtract(_tokenExpiryBuffer);
132136
_sessionToken = token;
133137
_persistor.write(_sessionTokenKey, token);

packages/clerk_auth/lib/src/clerk_auth/auth.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ class Auth {
353353
if (client.user is User) return client;
354354

355355
final expiry = client.signIn?.firstFactorVerification?.expireAt;
356-
if (expiry?.isAfter(DateTime.now()) != true) {
356+
if (expiry?.isAfter(DateTime.timestamp()) != true) {
357357
throw AuthError(
358358
message: 'Awaited user action not completed in required timeframe');
359359
}

packages/clerk_auth/lib/src/models/helpers.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:clerk_auth/clerk_auth.dart';
33
/// Convert a value to a [DateTime?]. For JsonSerializable
44
DateTime? intToDateTime(dynamic input) {
55
if (input is num) {
6-
return DateTime.fromMillisecondsSinceEpoch(input.toInt());
6+
return DateTime.fromMillisecondsSinceEpoch(input.toInt(), isUtc: true);
77
}
88
return null;
99
}

packages/clerk_auth/test/integration/clerk_api/sign_in_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ void main() {
99
late final Api api;
1010
late final TestEnv env;
1111
final httpClient = TestHttpClient();
12-
final expireAt =
13-
DateTime.now().add(const Duration(minutes: 5)).millisecondsSinceEpoch;
12+
final expireAt = DateTime.timestamp() //
13+
.add(const Duration(minutes: 5))
14+
.millisecondsSinceEpoch;
1415

1516
setUpAll(() async {
1617
env = TestEnv('.env.test');

packages/clerk_auth/test/integration/clerk_api/sign_up_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ void main() {
1414
late final Api api;
1515
late final TestEnv env;
1616
final httpClient = TestHttpClient();
17-
final expireAt =
18-
DateTime.now().add(const Duration(minutes: 5)).millisecondsSinceEpoch;
17+
final expireAt = DateTime.timestamp() //
18+
.add(const Duration(minutes: 5))
19+
.millisecondsSinceEpoch;
1920

2021
String emailAddress = '';
2122
String phoneNumber = '';

packages/clerk_auth/test/integration/clerk_api/user_details_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ void main() {
1414
late final Api api;
1515
late final TestEnv env;
1616
final httpClient = TestHttpClient();
17-
final expireAt =
18-
DateTime.now().add(const Duration(minutes: 5)).millisecondsSinceEpoch;
17+
final expireAt = DateTime.timestamp() //
18+
.add(const Duration(minutes: 5))
19+
.millisecondsSinceEpoch;
1920

2021
setUpAll(() async {
2122
env = TestEnv('.env.test');

packages/clerk_auth/test/integration/clerk_auth/sign_in_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ void main() {
88
late final Auth auth;
99
late final TestEnv env;
1010
final httpClient = TestHttpClient();
11-
final expireAt = DateTime.now() //
11+
final expireAt = DateTime.timestamp() //
1212
.add(const Duration(minutes: 5))
1313
.millisecondsSinceEpoch;
1414

packages/clerk_auth/test/integration/clerk_auth/sign_up_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ void main() {
99
late final Auth auth;
1010
late final TestEnv env;
1111
final httpClient = TestHttpClient();
12-
final expireAt = DateTime.now() //
12+
final expireAt = DateTime.timestamp() //
1313
.add(const Duration(minutes: 5))
1414
.millisecondsSinceEpoch;
1515

0 commit comments

Comments
 (0)