Как использовать OpenID без того, чтобы запрашивать у пользователя его OpenID URL?
====================================================================================

 Я поднимаю OpenID-провайдер при помощи DonNetOpenAuth, и я застрял.  

  

Похоже, что OpenID подразумевает, что на сайте, который является OpenID-клиентом, пользователь введёт свой OpenID URL, а затем будет перенаправлен на страничку провайдера. Ранее поданный URL подаётся страничке в качестве параметра (при использовании режима checkid\_setup).  

  

Но я часто вижу более удобное решение — например, в виде кнопки «Войти при помощи аккаунта Google». Тогда у пользователя не спрашивают никаких URL'ов, а просто редиректят на специальную страничку на гугле, где он либо логинится, либо просто редиректится назад, если уже залогинен (либо выбирает аккаунт, который он хочет использовать, если он уже залогинен под несколькими аккаунтами).  

  

Как такое реализовать? Это как-то связано с режимом check\_immediate?  

  

В принципе, провайдер я реализую для внутренних целей, поэтому я мог бы использовать и OAuth, если это удобнее. Да-да, я знаю, OAuth предназначен для авторизации, а не для аутентификации, но похоже, что в последнее время этот протокол стремится поддержать все возможные сценарии использования. 

 Как я понимаю (могу ошибаться):  

Кнопка ведёт не сразу на гугл, а на свой скрипт, который:  

1) Запрашивает у гугла по адресу [www.google.com/accounts/o8/id](https://www.google.com/accounts/o8/id) документ:  

```
<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
  <XRD>
  <Service priority="0">
  <Type>http://specs.openid.net/auth/2.0/server</Type>
  <Type>http://openid.net/srv/ax/1.0</Type>
  <Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
  <Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
  <Type>http://specs.openid.net/extensions/pape/1.0</Type>
  <URI>https://www.google.com/accounts/o8/ud</URI>
  </Service>
  </XRD>
</xrds:XRDS>

```
  

2) Парсит ответ, узнаёт из него возможности и расширения, поддерживаемые провайдером, и адрес странички, на которой пользователь должен авторизоваться  

3) Перенаправляет пользователя на эту страницу, естественно составив правильный запрос со всеми полями (openid.ns, openid.mode и т.д.)  

  

Гугл после авторизации редиректит пользователя на указанный openid.return\_to, после чего наш скрипт делает запрос на гугл для проверки авторизации