You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: EXAMPLES.md
+50-7Lines changed: 50 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -279,6 +279,21 @@ if (DPoP.isNonceRequiredError(response)) {
279
279
}
280
280
```
281
281
282
+
When using DPoP with `CredentialsManager` or `SecureCredentialsManager`, the `AuthenticationAPIClient` passed to the credentials manager **must** also have DPoP enabled. Otherwise, token refresh requests will be sent without the DPoP proof and the SDK will throw a `CredentialsManagerException.DPOP_NOT_CONFIGURED` error.
283
+
284
+
```kotlin
285
+
286
+
val auth0 =Auth0.getInstance("YOUR_CLIENT_ID", "YOUR_DOMAIN")
287
+
val apiClient =AuthenticationAPIClient(auth0).useDPoP(context) // DPoP enabled
288
+
val storage =SharedPreferencesStorage(context)
289
+
val manager =CredentialsManager(apiClient, storage)
290
+
291
+
WebAuthProvider
292
+
.useDPoP()
293
+
.login(auth0)
294
+
.start(context, callback)
295
+
```
296
+
282
297
On logout, you should call `DPoP.clearKeyPair()` to delete the user's key pair from the Keychain.
> DPoP is supported only on Android version 6.0 (API level 23) and above. Trying to use DPoP in any older versions will result in an exception.
297
312
298
313
## Authentication API
@@ -1661,11 +1676,21 @@ val auth0 = Auth0.getInstance("YOUR_CLIENT_ID", "YOUR_DOMAIN")
1661
1676
val apiClient =AuthenticationAPIClient(auth0).useDPoP(this)
1662
1677
val storage =SharedPreferencesStorage(this)
1663
1678
val manager =SecureCredentialsManager(apiClient, this, auth0, storage)
1679
+
```
1680
+
1681
+
Similarly, for `CredentialsManager`:
1664
1682
1683
+
```kotlin
1684
+
val auth0 =Auth0.getInstance("YOUR_CLIENT_ID", "YOUR_DOMAIN")
1685
+
val apiClient =AuthenticationAPIClient(auth0).useDPoP(this)
1686
+
val storage =SharedPreferencesStorage(this)
1687
+
val manager =CredentialsManager(apiClient, storage)
1665
1688
```
1666
1689
1690
+
> [!IMPORTANT]
1691
+
> When credentials are DPoP-bound, the SDK validates the DPoP key state before each token refresh. If the DPoP key pair is lost, the SDK will throw `CredentialsManagerException.DPOP_KEY_MISSING` and the user must re-authenticate. If the key pair has changed since the credentials were saved, the SDK will throw `CredentialsManagerException.DPOP_KEY_MISMATCH`. If the `AuthenticationAPIClient` was not configured with `useDPoP()`, the SDK will throw `CredentialsManagerException.DPOP_NOT_CONFIGURED`.
1667
1692
1668
-
> [!NOTE]
1693
+
> [!NOTE]
1669
1694
> DPoP is supported only on Android version 6.0 (API level 23) and above. Trying to use DPoP in any older versions will result in an exception.
1670
1695
1671
1696
@@ -2550,24 +2575,42 @@ In the event that something happened while trying to save or retrieve the creden
2550
2575
- Tokens have expired but no `refresh_token` is available to perform a refresh credentials request.
2551
2576
- Device's Lock Screen security settings have changed (e.g. the PIN code was changed). Even when `hasCredentials` returns true, the encryption keys will be deemed invalid and until `saveCredentials` is called again it won't be possible to decrypt any previously existing content, since they keys used back then are not the same as the new ones.
2552
2577
- Device is not compatible with some of the algorithms required by the `SecureCredentialsManager` class. This is considered a catastrophic event and might happen when the OEM has modified the Android ROM removing some of the officially included algorithms. Nevertheless, it can be checked in the exception instance itself by calling `isDeviceIncompatible`. By doing so you can decide the fallback for storing the credentials, such as using the regular `CredentialsManager`.
2578
+
-**DPoP key pair lost** — The DPoP key pair is no longer available in the Android KeyStore. The stored credentials are cleared and re-authentication is required.
2579
+
-**DPoP key pair mismatch** — The DPoP key pair exists but is different from the one used when the credentials were saved. The stored credentials are cleared and re-authentication is required.
2580
+
-**DPoP not configured** — The stored credentials are DPoP-bound but the `AuthenticationAPIClient` used by the credentials manager was not configured with `useDPoP(context)`. The developer needs to call `AuthenticationAPIClient(auth0).useDPoP(context)` and pass the configured client to the credentials manager.
2553
2581
2554
-
You can access the `code` property of the `CredentialsManagerException` to understand why the operation with `CredentialsManager` has failed and the `message` property of the `CredentialsManagerException` would give you a description of the exception.
2582
+
You can access the `code` property of the `CredentialsManagerException` to understand why the operation with `CredentialsManager` has failed and the `message` property of the `CredentialsManagerException` would give you a description of the exception.
2555
2583
2556
-
Starting from version `3.0.0` you can even pass the exception to a `when` expression and handle the exception accordingly in your app's logic as shown in the below code snippet:
2584
+
Starting from version `3.0.0` you can even pass the exception to a `when` expression and handle the exception accordingly in your app's logic as shown in the below code snippet:
2557
2585
2558
2586
```kotlin
2559
2587
when(credentialsManagerException) {
2560
-
CredentialsManagerException.NO_CREDENTIALS-> {
2588
+
CredentialsManagerException.NO_CREDENTIALS-> {
2561
2589
// handle no credentials scenario
2562
2590
}
2563
2591
2564
-
CredentialsManagerException.NO_REFRESH_TOKEN-> {
2592
+
CredentialsManagerException.NO_REFRESH_TOKEN-> {
2565
2593
// handle no refresh token scenario
2566
2594
}
2567
2595
2568
-
CredentialsManagerException.STORE_FAILED-> {
2596
+
CredentialsManagerException.STORE_FAILED-> {
2569
2597
// handle store failed scenario
2570
2598
}
2599
+
2600
+
CredentialsManagerException.DPOP_KEY_MISSING-> {
2601
+
// DPoP key was lost
2602
+
// Clear local state and prompt user to re-authenticate
2603
+
}
2604
+
2605
+
CredentialsManagerException.DPOP_KEY_MISMATCH-> {
2606
+
// DPoP key exists but doesn't match the one used at login (key rotation)
2607
+
// Clear local state and prompt user to re-authenticate
0 commit comments