Skip to content

Commit d0cf6e5

Browse files
authored
feat(dart): remove the access_token if is expired (#19)
1 parent f0cba44 commit d0cf6e5

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

lib/src/modules/token_storage.dart

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,37 @@ class TokenStorage {
8787
[String? resource, List<String>? scopes]) async {
8888
final key = _buildAccessTokenKey(resource, scopes);
8989

90-
if (_accessTokenMap != null) {
91-
return _accessTokenMap![key];
90+
_accessTokenMap ??= await _getAccessTokenMapFromStorage();
91+
92+
final accessToken = _accessTokenMap?[key];
93+
94+
// remove the access token if expired and return null
95+
if (accessToken?.isExpired == true) {
96+
await _deleteAccessToken(key);
97+
return null;
9298
}
9399

94-
_accessTokenMap = await _getAccessTokenMapFromStorage();
100+
return accessToken;
101+
}
102+
103+
Future<void> _deleteAccessToken(String accessTokenKey) async {
104+
final Map<String, AccessToken> tempAccessTokenMap =
105+
Map.from(_accessTokenMap ?? {});
106+
107+
final value = tempAccessTokenMap.remove(accessTokenKey);
108+
109+
// Do not update the storage if target accessToken does not exist
110+
if (value == null) return;
111+
112+
// clean up the storage if is empty
113+
if (tempAccessTokenMap.isEmpty) {
114+
await _storage.delete(key: _TokenStorageKeys.accessTokenKey);
115+
_accessTokenMap = null;
116+
return;
117+
}
95118

96-
return _accessTokenMap?[key];
119+
await _saveAccessTokenMapToStorage(tempAccessTokenMap);
120+
_accessTokenMap = tempAccessTokenMap;
97121
}
98122

99123
Future<void> _saveAccessTokenMapToStorage(

test/modules/token_storage_test.dart

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,19 @@ void main() {
5959
equals(tokenStorage?.expiresAt.toIso8601String()));
6060
});
6161

62-
test('access token should expires properly', () async {
63-
await sut.setAccessToken(accessToken, expiresIn: 1);
62+
test('should remove the expired access token and return null', () async {
63+
await sut.setAccessToken(accessToken,
64+
resource: resource, scopes: scope.split(' '), expiresIn: 1);
65+
66+
final tokenStorage = await sut.getAccessToken(resource, scope.split(' '));
67+
expect(tokenStorage?.token, accessToken);
6468

6569
await Future.delayed(const Duration(seconds: 2), () async {
66-
final token = await sut.getAccessToken();
67-
expect(token?.isExpired, true);
70+
final token = await sut.getAccessToken(resource, scope.split(' '));
71+
expect(token, isNull);
72+
expect(
73+
await storageStrategy.read(key: _TokenStorageKeys.accessTokenKey),
74+
isNull);
6875
});
6976
});
7077

0 commit comments

Comments
 (0)