Accessing Protected APIs
~3 minUse `ThunderIDProvider.of(context).client.getAccessToken()` to retrieve the current access token. The SDK automatically refreshes the token if it has expired. Pass the token as a `Bearer` credential in your HTTP requests.
Accessing Protected APIs
1
Using `http` Package
dart
Future<Map<String, dynamic>> fetchUserData(BuildContext context) async {final thunder = ThunderIDProvider.of(context);final token = await thunder.client.getAccessToken();final response = await http.get(Uri.parse('https://api.example.com/user'),headers: {'Authorization': 'Bearer $token','Content-Type': 'application/json',},);if (response.statusCode == 200) {return jsonDecode(response.body) as Map<String, dynamic>;}throw Exception('Request failed: ${response.statusCode}');}
2
Using `dio` with an Interceptor
Add [dio](https://pub.dev/packages/dio) to your `pubspec.yaml`:
yaml
dependencies:dio: ^5.4.0
3
Token Expiry and Refresh
`getAccessToken()` automatically refreshes the access token using the stored refresh token if the current token is expired. If the refresh token is also expired, it throws `IAMException` with code `IAMErrorCode.sessionExpired`.
dart
try {final token = await thunder.client.getAccessToken();// Use token...} on IAMException catch (e) {if (e.code == IAMErrorCode.sessionExpired) {// Session has fully expired. Sign the user out.await thunder.client.signOut();await thunder.refresh();}}
4
Checking Sign-In State Before Requests
Check `thunder.isSignedIn` before making API calls in widgets to avoid unnecessary network requests:
dart
@overrideWidget build(BuildContext context) {final thunder = ThunderIDProvider.of(context);return SignedIn(child: FutureBuilder(future: fetchUserData(context),builder: (context, snapshot) {if (snapshot.connectionState == ConnectionState.waiting) {return const CircularProgressIndicator();}if (snapshot.hasError) {return Text('Error: ${snapshot.error}');}return Text('Hello, ${snapshot.data}');},),fallback: const AuthScreen(),);}