Я занимаюсь разработкой Spring Boot REST API, который использует Firebase для аутентификации (т. Е. Использует Admin SDK для проверки переданных ID-токенов).Я использую стандартные токены Firebase ID без пользовательской аутентификации.
Spring AuthenticationProvider
@Component
class FirebaseAuthenticationProvider(private val firebaseAuth: FirebaseAuth) :
AbstractUserDetailsAuthenticationProvider() {
override fun supports(authentication: Class<*>?): Boolean {
return FirebaseAuthenticationToken::class.java.isAssignableFrom(authentication)
}
override fun retrieveUser(username: String?, authentication: UsernamePasswordAuthenticationToken?): UserDetails {
var firebaseAuthenticationToken = authentication as FirebaseAuthenticationToken
val task = firebaseAuth.verifyIdTokenAsync(firebaseAuthenticationToken.token)
try {
val firebaseToken = task.get()
return FirebaseUserDetails(firebaseToken.email, firebaseToken.uid)
} catch (e: Exception) {
when (e) {
is InterruptedException, is ExecutionException -> {
throw SessionAuthenticationException(e.message)
}
else -> throw e
}
}
}
override fun additionalAuthenticationChecks(userDetails: UserDetails?,
authentication: UsernamePasswordAuthenticationToken?) {
// nothing to do here
}
}
Я хочу провести интеграцию тестирования компонентов, которые извлекают токен, и проверить его с помощью Admin SDK.Для этого я хочу смоделировать клиент Android и получать свежий идентификатор токена для тестового пользователя при каждом запуске теста.
Например,
@Test
fun `accepts valid token`() {
// HOW TO DO THIS
val testToken: String = ???????????
println("Acquired token $testToken")
mockMvc.perform(get("/").header(FirebaseAuthenticationTokenFilter.TOKEN_HEADER, testToken))
.andExpect(status().isOk)
}
Как я могу получить действительный токен идентификатора в чистом Java при правильном адресе электронной почты и пароле?
Я попытался использовать REST API IdentityToolkit
private fun getTokenForTestUser() : String {
val restClient = RestTemplate()
val json = JSONObject().put("email", testUsername).put("password", testPassword)
val headers = HttpHeaders()
headers.contentType = MediaType.APPLICATION_JSON
headers.accept = listOf(MediaType.APPLICATION_JSON)
val request = HttpEntity(json.toString(), headers)
val response = restClient.postForObject(
"https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=$testApiKey",
request, Map::class.java) as Map<String, String>
return response["idToken"]!!
}
Однако это не работает, поскольку в извлеченных токенах отсутствует обязательное поле эмитента.