#oauth-2.0 #oauth #clientid #token-exchange
#oauth-2.0 #oauth #clientid #обмен токенами
Вопрос:
В настоящее время я внедряю STS обмена токенами OAuth и немного испытываю трудности. Стандарт определен в https://www.rfc-editor.org/rfc/rfc8693 Мой вариант использования включает в себя цепочку межсистемных вызовов, запускаемых действием пользователя (принципала). Я хочу убедиться, что авторизация на уровнях конечных точек выполняется с помощью сочетания областей и идентификаторов клиентов из белого списка. Кроме того, я хотел бы сохранить контекст клиента.
Я вижу, что здесь допустим сценарий обмена токенами. В спецификации приведен пример, в котором результирующий токен содержит субъекта, которому был делегирован доступ. Однако спецификация помещает логическую систему (иначе клиент OAuth) в утверждение «sub» вложенной информации об акторе, как показано здесь:
{
"aud":"https://service26.example.com",
"iss":"https://issuer.example.com",
"exp":1443904100,
"nbf":1443904000,
"sub":"user@example.com",
"act":
{
"sub":"https://service16.example.com",
"act":
{
"sub":"https://service77.example.com"
}
}
}
Я нахожу это немного странным. Я бы ожидал, что заявка «sub» будет содержать фактический субъект, если токен субъекта также был персонализированным токеном (скажем, «adminuser»).). На мой взгляд, система, которая проводила обмен токенами, отправила бы в качестве токена участника токен client_credentials. Это не содержит утверждения «sub», а только утверждение «cid» (client_id). Это утверждение должно быть включено в утверждение «act» результирующего токена, поэтому я ожидаю, что результирующий токен будет выглядеть следующим образом:
{
"aud":"https://service26.example.com",
"iss":"https://issuer.example.com",
"exp":1443904100,
"nbf":1443904000,
"sub":"user@example.com",
"cid":"3rd_client_that_conducted_token_exchange",
"act":
{
"cid":"2nd_client_id",
"act":
{
"cid":"initial_client_id"
}
}
}
Я не уверен, существует ли требуемая структура для утверждения «act» (насколько я вижу, нет). Есть ли здесь наилучшая практика? Любопытно узнать ваши мысли! 🙂
Ответ №1:
act
Утверждение не имеет стандартизированной структуры, единственное, что упоминается в RFC, это то, что оно должно состоять из любой информации, которая позволила бы вам идентифицировать субъекта.
Должно ли act
утверждение содержать информацию о пользователе или о клиенте, зависит от архитектуры вашей системы и от того, какая информация будет использоваться или требуется для других ваших служб. Если у вас есть сценарий, в котором права пользователя делегируются администратору, и вы хотите иметь эту информацию в токене, вы поместите данные администратора в act.sub
утверждение. Но если вы хотите указать, что один клиент делегирует привилегии другому клиенту, у вас будет идентификатор клиента в act.sub
утверждении. Идентификатор клиента также может быть субъектом, если делегирование выполняется между клиентами, а не пользователями.
Помните, что у вас также может быть сценарий олицетворения для обмена токенами. Таким образом, в результирующем токене у вас не будет никакой информации об актере. Например. вы можете попросить своего администратора выдать себя за пользователя. После выполнения обмена токенами вы выдадите токен пользователя без какой-либо информации о том, что на самом деле этот токен обрабатывает пользователь admin.
Вы упоминаете, что у вас есть цепочка систем, между которыми вы хотите обмениваться токенами. Я считаю, что для этого сценария идентификатор клиента действительно станет предметом вашего act
требования. Если я правильно понимаю, у вас есть ситуация, в которой у вас есть токен для пользователя X, выданный для использования в службе API 1 (в aud
утверждении указано, что). Затем служба API 1 хочет получить доступ к службе 2 и должна обменять токен. Теперь он получает другой токен, где вспомогательный элемент — пользователь X, аудитория — служба 2 и act.sub
служба 1, поскольку эта служба теперь действует как пользователь и хочет получить доступ к ресурсам в службе 2.
Комментарии:
1. спасибо за ваш вклад, Михал! Рад видеть, что я не пропустил rfc, который определяет
act
утверждение более подробно, я ценю ваше объяснение.