Обеспечение возможной подмены данных Google OpenID для запрашивающего сайта - PullRequest
0 голосов
/ 13 января 2012

Я, вероятно, упускаю что-то действительно глупое и пропустил это в документации Федеративный логин Google , но насколько логин Google OpenID действительно безопасен для запрашивающего сайта? Как запрашивающий сайт узнает, что данные поступают от Google, а не только от того, кто вводит параметры строки запроса в URL?

Чтобы проиллюстрировать это, я реализую базовую последовательность входа в систему OpenID в PHP, и все, что, по-видимому, возвращается, - это набор параметров строки запроса в URL-адресе, которые я могу использовать для получения деталей OpenID, что прекрасно работает. Проблема в том, что если бы я просто ввел их в адресную строку вручную, фактически не входя в систему с Google, как бы мой запрашивающий сайт узнал разницу?

Во-первых, форма, запрашивающая детали:

<form method='post' action='https://www.google.com/accounts/o8/ud'>

    <input type='hidden' name='openid.return_to' value='http://www.example/com/logged-in' />

    <input type='hidden' name='openid.mode' value='checkid_setup' />
    <input type='hidden' name='openid.ns' value='http://specs.openid.net/auth/2.0' />
    <input type='hidden' name='openid.claimed_id' value='http://specs.openid.net/auth/2.0/identifier_select' />
    <input type='hidden' name='openid.identity' value='http://specs.openid.net/auth/2.0/identifier_select' />

    <input type='hidden' name='openid.ns.ax' value='http://openid.net/srv/ax/1.0' />
    <input type='hidden' name='openid.ax.mode' value='fetch_request' />
    <input type='hidden' name='openid.ax.required' value='email,firstname,lastname' />
    <input type='hidden' name='openid.ax.type.email' value='http://axschema.org/contact/email' />
    <input type='hidden' name='openid.ax.type.firstname' value='http://axschema.org/namePerson/first' />
    <input type='hidden' name='openid.ax.type.lastname' value='http://axschema.org/namePerson/last' />

    <input type='submit' value='Login With Google Account' />

</form>

... это прекрасно работает, отправляя меня обратно на запрашивающий сайт по адресу http://www.example.com/logged-in с целым набором параметров URL, как показано ниже (из вызова PHP print_r):

Array
(
    [openid_ns] => http://specs.openid.net/auth/2.0
    [openid_mode] => id_res
    [openid_return_to] => http://www.example.com/logged-in
    [openid_ext1_type_firstname] => http://axschema.org/namePerson/first
    [openid_ext1_value_firstname] => {user's first name}
    [openid_ext1_type_email] => http://axschema.org/contact/email
    [openid_ext1_value_email] => {user's e-mail address}
    [openid_ext1_type_lastname] => http://axschema.org/namePerson/last
    [openid_ext1_value_lastname] => {user's last name}
)

... что удивительно, но откуда мне знать, что это на самом деле законный запрос, а не тот, кто вводит вышеуказанные параметры в адресную строку?

Спасибо за любую помощь, извинения, если об этом уже спрашивали (не удалось найти никаких реплик!) И если я упускаю что-то очевидное!

1 Ответ

1 голос
/ 26 января 2012

Не вдаваясь в подробности (читайте спецификацию OpenID, если вам нужны подробности), протокол OpenID имеет для этого меры безопасности. Полученные вами подтверждения подписаны и проверяемы, и существуют ограничения в том, как идентификаторы располагаются в пространстве имен, чтобы провайдеры не могли подделать идентификаторы друг друга. Если вы используете установленную библиотеку (например, с php-openid все в порядке), вам не нужно беспокоиться об этом, так как об этом обычно заботятся под крышками. Если вы пытаетесь свернуть свою реализацию ... ну, просто не ...

Тем не менее, есть некоторые вещи, которые не охватываются протоколом. Например, хотя атрибуты подписаны в ответе, вы не можете считать их точными, если не доверяете конкретному поставщику. Некоторые приложения будут проверять URL / имя хоста провайдера, который сделал утверждение (после проверки ответа), и белого списка известных провайдеров идентификации, которые выполняют правильную проверку электронной почты. Если вам нужен подтвержденный адрес электронной почты, это сделает UX лучше. Но если утверждение получено от неизвестного поставщика удостоверений, не думайте, что адрес электронной почты действительно принадлежит пользователю, если только вы сами не подтвердите владение.

...