diff --git a/packages/supabase_auth/lib/src/auth_admin_oauth_api.dart b/packages/supabase_auth/lib/src/auth_admin_oauth_api.dart index 8ecd6fa20..5d5b09d11 100644 --- a/packages/supabase_auth/lib/src/auth_admin_oauth_api.dart +++ b/packages/supabase_auth/lib/src/auth_admin_oauth_api.dart @@ -44,9 +44,9 @@ class OAuthClientListResponse { .map((e) => OAuthClient.fromJson(e as Map)) .toList(), audience: json['aud'] as String?, - nextPage: json['nextPage'] as int?, - lastPage: json['lastPage'] as int?, - total: json['total'] as int? ?? 0, + nextPage: (json['nextPage'] as num?)?.toInt(), + lastPage: (json['lastPage'] as num?)?.toInt(), + total: (json['total'] as num?)?.toInt() ?? 0, ); } } diff --git a/packages/supabase_auth/lib/src/types/jwt.dart b/packages/supabase_auth/lib/src/types/jwt.dart index f126ce428..416f03ff7 100644 --- a/packages/supabase_auth/lib/src/types/jwt.dart +++ b/packages/supabase_auth/lib/src/types/jwt.dart @@ -79,9 +79,9 @@ class JwtPayload { issuer: json['iss'] as String?, subject: json['sub'] as String?, audience: json['aud'], - expiresAt: json['exp'] as int?, - notBefore: json['nbf'] as int?, - issuedAt: json['iat'] as int?, + expiresAt: (json['exp'] as num?)?.toInt(), + notBefore: (json['nbf'] as num?)?.toInt(), + issuedAt: (json['iat'] as num?)?.toInt(), jwtId: json['jti'] as String?, claims: Map.of(json), ); diff --git a/packages/supabase_auth/lib/src/types/session.dart b/packages/supabase_auth/lib/src/types/session.dart index 63548f5c1..f43a40af2 100644 --- a/packages/supabase_auth/lib/src/types/session.dart +++ b/packages/supabase_auth/lib/src/types/session.dart @@ -47,7 +47,7 @@ class Session { } return Session( accessToken: json['access_token'] as String, - expiresIn: json['expires_in'] as int?, + expiresIn: (json['expires_in'] as num?)?.toInt(), refreshToken: json['refresh_token'] as String?, tokenType: json['token_type'] as String, providerToken: json['provider_token'] as String?, diff --git a/packages/supabase_auth/test/src/helper_test.dart b/packages/supabase_auth/test/src/helper_test.dart index f145dd43a..3ff10a403 100644 --- a/packages/supabase_auth/test/src/helper_test.dart +++ b/packages/supabase_auth/test/src/helper_test.dart @@ -1,4 +1,5 @@ import 'package:supabase_auth/src/helper.dart'; +import 'package:supabase_auth/src/types/jwt.dart'; import 'package:test/test.dart'; void main() { @@ -363,4 +364,19 @@ void main() { }); }); }); + + group('JwtPayload', () { + test('fromJson accepts double exp, nbf, and iat', () { + final payload = JwtPayload.fromJson({ + 'sub': '1234567890', + 'exp': 1700000000.0, + 'nbf': 1600000000.0, + 'iat': 1650000000.0, + }); + + expect(payload.expiresAt, equals(1700000000)); + expect(payload.notBefore, equals(1600000000)); + expect(payload.issuedAt, equals(1650000000)); + }); + }); } diff --git a/packages/supabase_auth/test/src/types/session_test.dart b/packages/supabase_auth/test/src/types/session_test.dart index 886127fea..9d89ddb23 100644 --- a/packages/supabase_auth/test/src/types/session_test.dart +++ b/packages/supabase_auth/test/src/types/session_test.dart @@ -109,6 +109,26 @@ void main() { ); expect(session.user.id, equals('123')); }); + + test('accepts a double expires_in, as sent by a BroadcastChannel', () { + final json = { + 'access_token': 'test-access-token', + 'expires_in': 3600.0, + 'token_type': 'bearer', + 'user': { + 'id': '123', + 'app_metadata': {}, + 'user_metadata': {}, + 'aud': 'authenticated', + 'created_at': '2023-01-01T00:00:00Z', + }, + }; + + final session = Session.fromJson(json); + + expect(session, isNotNull); + expect(session!.expiresIn, equals(3600)); + }); }); group('toJson', () {