Код авторизации Oauth2.0 Предоставление идентификатора клиента и секретной путаницы - PullRequest
1 голос
/ 17 апреля 2020

Я пытаюсь понять различные типы грантов, предлагаемые OAuth2.0. Я читал об этом, и есть много ресурсов, которые объясняют это в хороших деталях, таких как это , это & это , чтобы процитировать несколько.

В случае типа предоставления кода авторизации, насколько я понимаю, есть 2 шага.

Шаг 1 - Чтобы получить сам код авторизации

Итак, давайте предположим, что пользователь открывает приложение, скажем AwesomeApp в своем браузере. Это приложение имеет опцию, скажем, Войти через Facebook , которую пользователь выбирает на go вперед. Это инициирует запрос GET к серверу авторизации (в нашем примере, к Facebook) с необходимыми подробностями в параметре запроса, что-то вроде (взято из одного из ресурсов, указанных выше):

https://authorization-server-of-facebook.com/auth?response_type=code&
  client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=photos&state=1234zyx

Теперь я понять значение каждого из этих параметров (еще раз спасибо ресурсам). Я также понимаю, что прежде чем AwesomeApp сможет сделать этот вызов, он должен зарегистрироваться в Facebook, чтобы получить идентификатор клиента и секрет клиента ( с помощью некоторых средств ).

Теперь, когда пользователь утверждает запрос. Сервер авторизации Facebook отвечает на вышеуказанный запрос, перенаправляя браузер пользователя обратно на предоставленный URI перенаправления (в вышеуказанном запросе) и с кодом авторизации.

Шаг 2 - Обмен кода авторизации для фактического токена доступа

Теперь AwesomeApp необходимо обменять код авторизации, полученный выше, на токен доступа. Для этого AwesomeApp делает запрос POST, как показано ниже:

POST https://api.authorization-server-of-facebook.com/token
  grant_type=authorization_code&
  code=AUTH_CODE_RECEIVED_IN_THE_ABOVE_STEP&
  redirect_uri=REDIRECT_URI&
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET

На указанный выше запрос сервер авторизации facebook возвращает обратно токен доступа, refre sh токен, время истечения срока действия et c. и др c.

Теперь мой вопрос в шаге 2 выше. Разве этот POST не должен быть внутренним вызовом? Почему? Потому что это требует, чтобы секрет клиента также передавался в запросе. Если бы это было сделано из внешнего интерфейса AwesomeApp, он легко просочился бы в поддельного пользователя. Не так ли?

Так что я подумал, что это должно быть что-то вроде того, как только AwesomeApp получит код авторизации, клиентский интерфейс AwesomeApp должен отправить это в свой собственный бэкэнд и затем AwesomeApp ' Бэкэнд должен выполнить вышеуказанный POST-запрос, получить токен доступа (и другие подробности) из ответа на вышеуказанный запрос и затем передать его внешнему интерфейсу. Разве это не так, как должно быть?

Теперь в большинстве ресурсов, с которыми я сталкивался (включая ссылки выше), обсуждается PKCE Extension, в котором говорится о генерации динамического c клиентского секрета каждый раз. , Но как лучше, если POST (тот, что на шаге 2) все еще выполняется из самого интерфейса? Также, если этот секретный ключ клиента генерируется динамически каждый раз, это может быть сделано ложным пользователем, не так ли? Я имею в виду, как сервер авторизации может проверить, что клиент, сделавший запрос, действительно был тем, кого он разрешил? (В случае с секретом клиента это имело смысл, потому что секрет клиента был передан AwesomeApp сервером авторизации Facebook. В этом случае это не так, потому что этот секрет генерируется самим клиентом).

Что за недоразумение во всем вышеперечисленном?

Согласно описанному потоку здесь , enter image description here, как работает code_verifier мешать злоумышленнику играть за подлинное приложение? В отличие от секрета клиента, когда злоумышленник никогда не сможет выдать себя за подлинного клиента (если, конечно, сам секрет клиента не будет каким-то образом взломан), в этом случае злоумышленник может просто отправить любой code_verifier. Еще до того, как запрос токена и проверка code_verifier & окончательного ответа появятся на снимке, как сервер авторизации может даже проверить, что запрос авторизации действительно поступил от подлинного клиента?

1 Ответ

1 голос
/ 17 апреля 2020

Вы правильно понимаете поток кода авторизации. В оригинальном OAuth2 spe c поток кода предназначался для конфиденциальных клиентов (то есть традиционных веб-приложений, работающих на сервере). Неявный поток предназначен для приложений, работающих внутри браузера, таких как одностраничные приложения. Неявный поток доставляет токен доступа клиенту напрямую через URI перенаправления.

Теперь неявный поток был уязвим для утечки токена (заголовки ссылок и журналы сервера), поэтому PKCE был изобретен для использования кода поток для publi c клиентов также. Он генерирует хэшированное значение из идентификатора verifier и отправляет его с запросом авторизации. Когда клиент получает код, он использует верификатор в качестве секрета, чтобы доказать серверу авторизации, что именно клиент сделал исходный запрос на авторизацию (на который пользователь вошел в систему).

Даже если злонамеренный клиент может сгенерировать запрос авторизации, пользователь должен войти в систему и дать согласие на получение клиентом токена доступа для доступа к своим данным. Если пользователь решает доверять злонамеренному клиенту, протокол ничего не может сделать, так как клиент не должен аутентифицировать себя.

...