#android #spring-boot #auth0
#Android #spring-boot #auth0
Вопрос:
У меня есть серверный API Spring Boot, использующий аутентификацию Auth0 JWT, и в настоящее время у меня есть два клиента для него, Vue SPA и приложение для Android. Vue SPA работает нормально. Он использует тип приложения SPA в Auth0, а механизм аутентификации использует аудиторию, например, так:
{
"domain": "mycompany.auth0.com",
"clientId": "mySPAclientID",
"audience": "https://myaudience.mycompany.com"
}
Я подумал, что смогу сделать что-то подобное в Android, поэтому я создал собственный тип приложения на своей панели управления Auth0, загрузил соответствующий quickstart и попытался пройти аутентификацию. Я, конечно, могу пройти аутентификацию с использованием Auth0 и получить JWT обратно, но JWT не работает с моим Spring Boot API, который обозначен моимhttps://myaudience.mycompany.com аудитория, которая, как ожидается, будет присутствовать в моей конфигурации безопасности Spring Boot в JWT. Моей первой мыслью было, что я мог бы просто добавить аудиторию к действию входа в приложение для Android:
WebAuthProvider.login(auth0)
.withScheme("demo")
.withAudience(String.format("https://%s/userinfo", getString(R.string.com_auth0_domain)))
.withAudience("https://myaudience.mycompany.com") // added this
.start(this, new AuthCallback() { ... }
Но это не работает. Когда я анализирую возвращенный JWT, часть audience не содержит ожидаемого блока. Это должно выглядеть следующим образом:
"aud": [
"https://myaudience.mycompany.com",
"https://mycompany.auth0.com/userinfo"
]
Но вместо этого это выглядит так:
"aud": "myNativeClientID"
Также полностью отсутствует элемент scope. Каков правильный способ заставить это работать? Нужен ли мне новый Auth0 API, для которого потребуется новый механизм безопасности Spring Boot? Или есть что-то простое, чего мне не хватает в запросе на вход? Или какой-то конфигурации мне не хватает в моем родном приложении Auth0? Я просмотрел всю соответствующую документацию, и ничего не работает. Я не уверен, как действовать дальше, любая помощь была бы очень признательна.
Ответ №1:
Благодаря полезной подсказке сотрудника Auth0 я понял, что перепутал токен Auth0 ID с токеном доступа. В Auth0 токены ID всегда выдаются как JWT, но их нельзя использовать для доступа к API Auth0, это могут делать только токены доступа. Проблема в том, что, если вы не укажете «аудиторию» в своем запросе на вход, токен доступа имеет простой формат токена, подобный этому:
1v-QyDrPaJ5rOUBOk3g_0HtEwtN4C-4U
Но когда вы добавляете аудиторию (т. Е. API Auth0, на который, в свою очередь, ссылаются в вашем серверном интерфейсе, каким бы он ни был, в моем случае Spring Boot), токен доступа становится JWT со всеми необходимыми аудиториями и областями (по умолчанию область действия ограничена openapi, я полагаю).
Итак, поскольку токен доступа не был JWT (поскольку я еще не добавил аудиторию, когда впервые проверил ответ на вход), я отклонил его и использовал токен ID, который, как я упоминал, нельзя использовать для получения доступа к API Auth0. Как только я вернулся к использованию токена доступа JWT, все заработало, как ожидалось.
Принимаю это как ответ на случай, если это поможет кому-либо в будущем.