Я, вероятно, упускаю что-то действительно глупое и пропустил это в документации Федеративный логин 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}
)
... что удивительно, но откуда мне знать, что это на самом деле законный запрос, а не тот, кто вводит вышеуказанные параметры в адресную строку?
Спасибо за любую помощь, извинения, если об этом уже спрашивали (не удалось найти никаких реплик!) И если я упускаю что-то очевидное!