Использование Google OIDC с потоком кода и PKCE

после проб и ошибок мне кажется, что Google OIDC не поддерживает поток кода без предоставления секрета клиента: https://developers.google.com/identity/protocols/oauth2/native-app#exchange-кодавторизации

В соответствии с последними передовыми практиками для SPA (https://tools.ietf.org/html/draft-ietf-oauth-security-topics-13), поток кода + PKCE - рекомендуемый способ обработки аутентификации. Кто-нибудь знает о каком-либо трюке, необходимом для того, чтобы поток кода Google принимал code_challenge, а не client_secret? Может, пустышка?


person Marco Santarelli    schedule 17.03.2020    source источник
comment
У меня также есть проблемы с client_secret прямо сейчас. Итак, я открыл вопрос в Google, чтобы уделить ему внимание. Любая поддержка по этому поводу будет приветствоваться. Основная проблема заключается в том, что конечные точки accounts.google.com/token требуют от нас отправки client_secret для веб-клиентов. issueetracker.google.com/issues/184351769   -  person Flos    schedule 06.04.2021


Ответы (2)


По состоянию на август 2020 года указанный документ о передовых методах работы все еще находится в стадии разработки и активно обновляется - см. Редакцию здесь: https://datatracker.ietf.org/doc/draft-ietf-oauth-security-topics/. В реализации OAuth2 в Google еще не применена рекомендация по применению PKCE к веб-приложениям. Для SPA по-прежнему рекомендуется использовать неявный поток в онлайн-документации Googles: https://developers.google.com/identity/protocols/oauth2/javascript-implicit-flow).

В стандарте PKCE (https://tools.ietf.org/html/rfc7636) говорится, что он был разработан как средство защиты от атак с перехватом кода авторизации, обнаруженных на мобильных платформах, и изначально был рекомендован для реализации собственными клиентами. Документация Google для мобильных и настольных приложений побуждает разработчиков использовать поток кода авторизации PKCE. Клиенты, использующие типы учетных данных Google Android, iOS или Windows с PKCE, могут опускать client_secret (см. Примечание к таблице параметров токена обновления - и подтверждено Криштиану).

В настоящее время признано, что PKCE устраняет необходимость для любых общедоступных клиентов в хранении секрета клиента и, как таковой, может использоваться для исключения неявного потока, который всегда имел недостаток включения возвращаемых токенов доступа и идентификаторов в URI перенаправления. https://developer.okta.com/blog/2019/05/01/is-the-oauth-implicit-flow-dead.

В проекте документа IETF говорится в разделе 2.1.1, что это признание, вероятно, станет опубликованным стандартом.

Надеюсь, Google обновит свою реализацию, убрав требование client_secret для запроса токена PKCE, когда передовые методы будут приняты. Между тем, похоже, у нас нет другого выбора, кроме как продолжать писать SPA с использованием неявного потока.

person Richard Woods    schedule 06.08.2020
comment
Нелепо, я не мог поверить в ваш последний отрывок. Но это правда?! developers.google.com/identity/protocols/oauth2/ Говорит, что Google поддерживает [PKCE], чтобы сделать установленный поток приложений более безопасным. Но я не могу сделать Google OIDC с помощью PKCE без секрета клиента. Google вынуждает меня хранить секрет на моем клиенте, который всегда можно украсть, см. developer.okta.com/blog/2019/01/22/. Полностью устраняет любые преимущества безопасности, которые обеспечивает PKCE? Скажите, пожалуйста, я ошибаюсь. - person Heinzlmaen; 17.09.2020
comment
Я хотя бы частично ошибаюсь. PKCE все еще защищен imo. Но я не уверен, что произойдет, если у вас есть несколько приложений с разными потоками для одного зарегистрированного API / приложения Google. Если ваше приложение PKCE раскрывает секрет, остаются ли другие приложения с другими потоками безопасными? - person Heinzlmaen; 17.09.2020
comment
Что-то изменилось в этом плане? Я не могу найти ничего, чтобы сказать иначе. - person Robotronx; 20.01.2021
comment
@Heinzlmaen да, в этом суть PKCE ... «секрет клиента» не считается секретом. Независимо от того, заставлял ли вас Google его предоставить или нет, в конечном итоге ему не доверяют. Хотя это может, по крайней мере, вынудить злоумышленника приложить немного больше усилий ... то есть, если секрет клиента на самом деле неверен, то отправка кода состояния 4xx как можно скорее потребляет меньше ресурсов, чем прохождение всей этой шарады до тех пор, пока обнаружено, что PKCE также ошибочен. Так что думайте об этом как об отказе от злоупотреблений. - person David Bullock; 16.03.2021
comment
@DavidBullock Что значит «секрет клиента» не считается секретом? Конечно, злоумышленнику требуется доступ к большему количеству ресурсов в дополнение к секрету, чтобы причинить вред, например действующему URI перенаправления, но это уже другая тема. В любом случае, в спецификациях Oauth2 четко сказано, что секрет не должен разглашаться. Независимо от того, используете ли вы фиктивный секрет, не имеет значения, это все еще действительный секрет. - person Ash; 07.06.2021
comment
@Ash Для установленных приложений вы, вероятно, «распространяете двоичный файл приложения» (например, через магазин приложений), и теперь любая сторона с вашим двоичным кодом имеет в своем дизассемблере «client_secret» и «client_id» вашего приложения. Для веб-сайтов ... секрет клиента остается на ферме серверов, без проблем. Но установленное приложение, выполняющее поток «кода авторизации» без PCKE, рискует, что враждебное приложение на том же устройстве перехватит «перенаправление», а затем использует идентификатор клиента / секрет клиента ВАШЕГО приложения для обмена кода на токен доступа. При использовании PCKE он также должен доказать, что именно он инициировал запрос OAuth до получения токена. - person David Bullock; 07.06.2021
comment
@DavidBullock Я знаю, как работает PKCE и каковы его преимущества, я не об этом спрашиваю. Чтобы повторить то, что я сказал в своем последнем комментарии, я спрашиваю, что вы имеете в виду под «секретом клиента», который не считается секретом? Это секрет; его не следует выставлять напоказ. Всегда. Согласно документам Google, вы должны предоставить code_verifier при выполнении потока с PKCE, а также client_secret, тем самым полностью игнорируя точку PKCE ... которая не должна предоставлять секрет. - person Ash; 07.06.2021
comment
@Ash, но дело в том, что если вы распространяете двоичные файлы приложения, client_secret теперь «не очень секретный». Каждая копия приложения обязательно должна иметь встроенное приложение client_secret. Конечно, это могло быть запутано. Но «секретность» в том смысле, что только Алиса и Боб знают, что это такое, исчезла. Вот почему RFC 7636 говорит, что секреты, предоставленные в клиентских двоичных приложениях, не могут считаться конфиденциальными (Раздел 1, 3-й элемент списка). datatracker.ietf.org/doc/html/rfc7636 - person David Bullock; 07.06.2021
comment
@Ash Я также говорю, что «null client_secret» и «client-secret с высокой энтропией» эквивалентны при использовании PKCE. Некоторые серверы авторизации (например, Xero), которые используют поток authorization code with PCKE, даже не позволяют вам предоставить client_secret, когда вы регистрируете свое приложение PCKE на authzn_server. То, что Google требует client_secret даже при использовании PCKE, не нужно и их раздражает. Но лишь в незначительной степени. - person David Bullock; 07.06.2021

Ну, я использую код авторизации openId Connect с pkce без использования client_secret в приложении для Android, используя эту библиотеку: https://github.com/openid/AppAuth-Android.

Мне просто нужно было убедиться, что настраиваемая схема была установлена ​​с использованием имени пакета приложения из манифеста, и использовать его для регистрации учетных данных Android в консоли Google.

person Cristiano    schedule 07.04.2020
comment
Но вы не используете Google OIDC? - person Heinzlmaen; 17.09.2020