Запрос идентификационных токенов в Java - PullRequest
0 голосов
/ 28 мая 2018

Я занимаюсь разработкой 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"]!!
}

Однако это не работает, поскольку в извлеченных токенах отсутствует обязательное поле эмитента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...