Skip to content

Commit 6740faa

Browse files
authored
Exposes UserProfile to return contents of id token without refreshing credentials (#840)
1 parent c3c8219 commit 6740faa

File tree

4 files changed

+45
-2
lines changed

4 files changed

+45
-2
lines changed

auth0/src/main/java/com/auth0/android/authentication/storage/BaseCredentialsManager.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@ package com.auth0.android.authentication.storage
33
import androidx.annotation.VisibleForTesting
44
import com.auth0.android.authentication.AuthenticationAPIClient
55
import com.auth0.android.callback.Callback
6+
import com.auth0.android.request.internal.GsonProvider
7+
import com.auth0.android.request.internal.Jwt
68
import com.auth0.android.result.APICredentials
79
import com.auth0.android.result.Credentials
810
import com.auth0.android.result.SSOCredentials
11+
import com.auth0.android.result.UserProfile
912
import com.auth0.android.util.Clock
1013
import java.util.*
14+
import kotlin.collections.component1
15+
import kotlin.collections.component2
1116

1217
/**
1318
* Base class meant to abstract common logic across Credentials Manager implementations.
@@ -38,6 +43,7 @@ public abstract class BaseCredentialsManager internal constructor(
3843
callback: Callback<SSOCredentials, CredentialsManagerException>
3944
)
4045

46+
4147
public abstract fun getSsoCredentials(
4248
callback: Callback<SSOCredentials, CredentialsManagerException>
4349
)
@@ -136,6 +142,8 @@ public abstract class BaseCredentialsManager internal constructor(
136142
headers: Map<String, String> = emptyMap()
137143
): APICredentials
138144

145+
public abstract val userProfile: UserProfile?
146+
139147
public abstract fun clearCredentials()
140148
public abstract fun clearApiCredentials(audience: String)
141149
public abstract fun hasValidCredentials(): Boolean

auth0/src/main/java/com/auth0/android/authentication/storage/CredentialsManager.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
package com.auth0.android.authentication.storage
22

33
import android.text.TextUtils
4+
import android.util.Base64
45
import android.util.Log
56
import androidx.annotation.VisibleForTesting
67
import com.auth0.android.authentication.AuthenticationAPIClient
78
import com.auth0.android.authentication.AuthenticationException
9+
import com.auth0.android.authentication.storage.SecureCredentialsManager.Companion.KEY_CREDENTIALS
810
import com.auth0.android.callback.Callback
911
import com.auth0.android.request.internal.GsonProvider
12+
import com.auth0.android.request.internal.Jwt
1013
import com.auth0.android.result.APICredentials
1114
import com.auth0.android.result.Credentials
15+
import com.auth0.android.result.OptionalCredentials
1216
import com.auth0.android.result.SSOCredentials
17+
import com.auth0.android.result.UserProfile
1318
import com.auth0.android.result.toAPICredentials
1419
import com.google.gson.Gson
1520
import kotlinx.coroutines.suspendCancellableCoroutine
1621
import java.util.*
1722
import java.util.concurrent.Executor
1823
import java.util.concurrent.Executors
24+
import kotlin.collections.component1
25+
import kotlin.collections.component2
1926
import kotlin.coroutines.resume
2027
import kotlin.coroutines.resumeWithException
2128

@@ -44,6 +51,18 @@ public class CredentialsManager @VisibleForTesting(otherwise = VisibleForTesting
4451
Executors.newSingleThreadExecutor()
4552
)
4653

54+
public override val userProfile: UserProfile?
55+
get() {
56+
val idToken = storage.retrieveString(KEY_ID_TOKEN)
57+
58+
if (idToken.isNullOrBlank()) {
59+
return null
60+
}
61+
val (_, payload) = Jwt.splitToken(idToken)
62+
val gson = GsonProvider.gson
63+
return gson.fromJson(Jwt.decodeBase64(payload), UserProfile::class.java)
64+
}
65+
4766
/**
4867
* Stores the given credentials in the storage. Must have an access_token or id_token and a expires_in value.
4968
*

auth0/src/main/java/com/auth0/android/authentication/storage/SecureCredentialsManager.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,23 @@ import com.auth0.android.authentication.AuthenticationAPIClient
1111
import com.auth0.android.authentication.AuthenticationException
1212
import com.auth0.android.callback.Callback
1313
import com.auth0.android.request.internal.GsonProvider
14+
import com.auth0.android.request.internal.Jwt
1415
import com.auth0.android.result.APICredentials
1516
import com.auth0.android.result.Credentials
1617
import com.auth0.android.result.OptionalCredentials
1718
import com.auth0.android.result.SSOCredentials
19+
import com.auth0.android.result.UserProfile
1820
import com.auth0.android.result.toAPICredentials
1921
import com.google.gson.Gson
22+
import kotlinx.coroutines.CoroutineScope
23+
import kotlinx.coroutines.GlobalScope
24+
import kotlinx.coroutines.launch
2025
import kotlinx.coroutines.suspendCancellableCoroutine
2126
import java.lang.ref.WeakReference
2227
import java.util.*
2328
import java.util.concurrent.Executor
29+
import kotlin.collections.component1
30+
import kotlin.collections.component2
2431
import kotlin.coroutines.resume
2532
import kotlin.coroutines.resumeWithException
2633

@@ -250,6 +257,16 @@ public class SecureCredentialsManager @VisibleForTesting(otherwise = VisibleForT
250257
}
251258
}
252259

260+
public override val userProfile: UserProfile?
261+
get() {
262+
val credentials: Credentials? = getExistingCredentials()
263+
// Handle null credentials gracefully
264+
if (credentials == null) {
265+
return null
266+
}
267+
return credentials.user
268+
}
269+
253270
/**
254271
* Creates a new request to exchange a refresh token for a session transfer token that can be used to perform web single sign-on.
255272
*

auth0/src/test/java/com/auth0/android/authentication/storage/SecureCredentialsManagerTest.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,7 @@ public class SecureCredentialsManagerTest {
173173
)
174174
MatcherAssert.assertThat(manager, Is.`is`(Matchers.notNullValue()))
175175
}
176-
177-
176+
178177
/*
179178
* SAVE SSO credentials test
180179
*/

0 commit comments

Comments
 (0)