Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(dart): fix getAccessToken always null bug #67

Merged
merged 1 commit into from
Sep 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions lib/logto_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ class LogtoClient {
}

return await _tokenStorage.getAccessToken(
resource: resource, organizationId: organizationId, scopes: scopes);
resource: resource, organizationId: organizationId);
} finally {
if (_httpClient == null) httpClient.close();
}
Expand Down Expand Up @@ -257,7 +257,8 @@ class LogtoClient {
idToken: idToken,
accessToken: tokenResponse.accessToken,
refreshToken: tokenResponse.refreshToken,
expiresIn: tokenResponse.expiresIn);
expiresIn: tokenResponse.expiresIn,
scopes: tokenResponse.scope.split(' '));
}

// Sign out the user.
Expand Down
12 changes: 7 additions & 5 deletions lib/src/modules/token_storage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,10 @@ class TokenStorage {

Future<AccessToken?> getAccessToken({
String? resource,
List<String>? scopes,
String? organizationId,
}) async {
final key = buildAccessTokenKey(
resource: resource, scopes: scopes, organizationId: organizationId);
final key =
buildAccessTokenKey(resource: resource, organizationId: organizationId);

_accessTokenMap ??= await _getAccessTokenMapFromStorage();

Expand Down Expand Up @@ -145,7 +144,9 @@ class TokenStorage {
String? organizationId,
required int expiresIn}) async {
final key = buildAccessTokenKey(
resource: resource, organizationId: organizationId, scopes: scopes);
resource: resource,
organizationId: organizationId,
);

// load current accessTokenMap
final currentAccessTokenMap =
Expand Down Expand Up @@ -197,10 +198,11 @@ class TokenStorage {
required IdToken idToken,
required String accessToken,
String? refreshToken,
List<String>? scopes,
required int expiresIn,
}) async {
await Future.wait([
setAccessToken(accessToken, expiresIn: expiresIn),
setAccessToken(accessToken, expiresIn: expiresIn, scopes: scopes),
setIdToken(idToken),
setRefreshToken(refreshToken),
]);
Expand Down
25 changes: 11 additions & 14 deletions test/modules/token_storage_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,14 @@ void main() {
});
test('should set access token locally and persist it', () async {
await sut.setAccessToken(accessToken,
resource: resource, scopes: scope.split(' '), expiresIn: 1);
resource: resource, scopes: scope.split(' '), expiresIn: 1000);

final nullToken = await sut.getAccessToken();
expect(nullToken, isNull);

final tokenStorage = await sut.getAccessToken(
resource: resource, scopes: scope.split(' '));
resource: resource,
);

expect(tokenStorage?.token, accessToken);
// scope should be sorted
Expand All @@ -53,7 +54,7 @@ void main() {
await storageStrategy.read(key: _TokenStorageKeys.accessTokenKey);

final tokenMap = jsonDecode(persistedStorageAccessToken ?? '{}');
final Map<String, dynamic> token = tokenMap['email profile@/api/foo'];
final Map<String, dynamic> token = tokenMap['@/api/foo'];

expect(token['token'], tokenStorage?.token);
expect(token['scope'], tokenStorage?.scope);
Expand All @@ -71,8 +72,8 @@ void main() {
final nullToken = await sut.getAccessToken();
expect(nullToken, isNull);

final tokenStorage = await sut.getAccessToken(
scopes: scope.split(' '), organizationId: organizationId);
final tokenStorage =
await sut.getAccessToken(organizationId: organizationId);

expect(tokenStorage?.token, accessToken);
// scope should be sorted
Expand All @@ -84,8 +85,7 @@ void main() {

final tokenMap = jsonDecode(persistedStorageAccessToken ?? '{}');

final Map<String, dynamic> token =
tokenMap['email profile@#$organizationId'];
final Map<String, dynamic> token = tokenMap['@#$organizationId'];

expect(token['token'], tokenStorage?.token);
expect(token['scope'], tokenStorage?.scope);
Expand All @@ -98,12 +98,12 @@ void main() {
resource: resource, scopes: scope.split(' '), expiresIn: 1);

final tokenStorage = await sut.getAccessToken(
resource: resource, scopes: scope.split(' '));
resource: resource,
);
expect(tokenStorage?.token, accessToken);

await Future.delayed(const Duration(seconds: 2), () async {
final token = await sut.getAccessToken(
resource: resource, scopes: scope.split(' '));
final token = await sut.getAccessToken(resource: resource);
expect(token, isNull);
expect(
await storageStrategy.read(key: _TokenStorageKeys.accessTokenKey),
Expand Down Expand Up @@ -159,10 +159,7 @@ void main() {

await sut.clear();

expect(
await sut.getAccessToken(
resource: resource, scopes: scope.split(' ')),
null);
expect(await sut.getAccessToken(resource: resource), null);
expect(await sut.refreshToken, null);
expect(await sut.idToken, null);

Expand Down
Loading