Хранение aws cognito JWT-ключа в javascript-интерфейсе небезопасно?
Я просматривал файлы javascript на сайте, чтобы найти нужную конечную точку, во время которой я нашел такую строку.
DASHBOARD_API_Token=eyJraWQiOiJVS2paTnB3SWdBK292QzB3RWdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Когда я декодировал Above JWT, я нашел такие объекты, как kid, username, useremail, iss = http://cognito-idp.us-east-1.amazonaws.com/ {pool-id}
Я прочитал несколько ресурсов Amazon, которые говорят, что можно получить учетные данные aws, используя вышеуказанный токен. Учитывая, что у меня есть только токен jwt, что возможно, и нужно ли мне обращаться на веб-сайт, чтобы отозвать текущий токен?
1 ответ
Ну, AWS Cognito - довольно интересный зверь, когда дело доходит до его токенов JWT и того, что вы можете с ними делать.
Во-первых, когда вы аутентифицируете пользователя по Cognito User Pool, вы получаете 3 разных токена: AccessToken
, IdToken
, а также RefreshToken
, И то и другое AccessToken
а также IdToken
действительны ровно 1 час (и вы не можете их изменить). Вот почему вы получаете RefreshToken
, который вы можете использовать, чтобы получить новую пару AccessToken
а также IdToken
вызывая, например, InitiateAuth. RefreshToken
по умолчанию действует в течение 30 дней, но вы можете изменить его в настройках вашего пула пользователей Cognito.
маркер доступа
Это самый мощный токен, который дает Cognito. Если у вас есть действительный AccessToken
Вы можете вызвать несколько довольно чувствительных API Cognito.
Одним из очень удивительных примеров является то, что вы можете вызвать API DeleteUser, предоставив AccessToken
и он полностью удалит вашу учетную запись из Cognito User Pool. Самое приятное здесь то, что разработчик приложения не может помешать вам сделать это, если у вас есть действительный AccessToken
, Разработчики AWS говорят, что "это по замыслу". Это была одна из самых веских причин, по которой мы решили не передавать Cognito Access Token на интерфейс приложения.
Говоря о полезной нагрузке AccessToken
единственным потенциально чувствительным требованием является client_id
, который содержит идентификатор клиента Cognito, который использовался для аутентификации пользователя. Если у этого клиента нет клиентского секрета (который, вероятно, в первую очередь следует считать недостатком безопасности), то client_id
может использоваться для вызова довольно широкого спектра API Cognito. Тем не менее, Cognito считает, client_id
быть публичной информацией. Все остальные претензии считаются публичными, полный список претензий вы можете посмотреть здесь.
IdToken
Содержит информацию об игроке. Он может содержать некоторую личную информацию об игроке в зависимости от того, какие стандартные утверждения и пользовательские атрибуты были настроены в вашем пуле пользователей Cognito, однако также можно подавить или переопределить эти утверждения с помощью лямбда-триггера Pre Token Generation. Использование этого триггера позволяет скрывать или маскировать атрибуты игрока, которые считаются чувствительными и не должны появляться в IdToken
,
Насколько я знаю, вы не можете использовать IdToken
вызывать Cognito API.
RefreshToken
Может использоваться только для запроса нового AccessToken
а также IdToken
, не может использоваться для вызова API Cognito. В нашем конкретном случае использования мы должны были избегать прохождения RefreshToken
к интерфейсу приложения, так как его можно использовать для получения AccessToken
против общедоступного Cognito API (это означает, что мы не можем помешать пользователю сделать это).
Использование токенов Cognito для получения учетных данных AWS
Это возможно только в том случае, если Cognito User Pool был явно интегрирован с Cognito Identity Pool (что предполагает, что разработчики приложений знали, что они делают). При обмене токенами Cognito JWT вы получаете временные учетные данные AWS с разрешениями, привязанными к определенной роли IAM, настроенной в Cognito Identity Pool. Это абсолютно законный поток и предполагаемое поведение. Более того, если Cognito Identity Pool настроен для разрешения неаутентифицированного доступа, вы даже можете получить временные учетные данные AWS без использования токенов Cognito JWT (но они будут связаны с другой, предположительно, более строгой ролью IAM).
Использование токенов Cognito с API Gateway
Ресурсы AWS API Gateway можно интегрировать с пользовательскими пулами Cognito. В зависимости от того, как выполняется интеграция, вы можете использовать AccessToken
или же IdToken
из интегрированного пула пользователей Cognito.
Отзыв токенов
Вы можете отозвать все токены, выпущенные для вашей учетной записи в Cognito User Pool, позвонив в GlobalSignOut API и предоставив действительный AccessToken
, Поскольку этот API является общедоступным, вам не нужно связываться с сайтом, если у вас есть действующий AccessToken
,