Мне нужна следующая архитектура (я составил название продукта для этого примера):
Приложение Web API 2, работающее на одном сервере http://api.prettypictures.com
Клиентское приложение MVC 5 работает на другом сервере http://www.webpics.com
Я хотел бы, чтобы www.webpics.com клиентское приложение использовало API Pretty Pictures для:
- Зарегистрируйте новые учетные записи с именем пользователя и паролем.
- Зарегистрируйте новые учетные записи в Facebook/Google/Twitter/Microsoft.
- Войти
- Извлечение изображений
Все вышеперечисленные работы за исключением регистрации внешних учетных записей в Facebook, Google и т.д.
Я не могу обработать правильный поток для создания внешней учетной записи от отдельного клиента API.
Я изучил большинство документов, доступных в потоке аутентификации, например:
Я прочитал почти все, что могу, о новой модели Identity в OWIN.
Я рассмотрел шаблон SPA в Visual Studio 2013. Он демонстрирует, как делать большую часть того, что мне нужно, но только тогда, когда клиент и API находятся на одном хосте; если я хочу, чтобы несколько клиентов обращались к моему API и могли разрешить пользователям регистрироваться через Google и т.д., это не работает, и насколько я могу сказать, что поток аутентификации OWIN ломается.
Вот поток до сих пор:
- Пользователь просматривает www.webpics.com/Login
- www.webpics.com вызывает api.prettypictures.com/Account/ExternalLogins (с returnUrl, чтобы вернуться к обратному вызову на www.webpics.com) и отображает результирующие ссылки на пользователя.
- Пользователь нажимает кнопку "Google"
- Браузер перенаправляет на api.prettypictures.com/Account/ExternalLogin имя поставщика и т.д.
- Действие API ExternalLogin вызывает вызов google.com
- Браузер перенаправляется на google.com
- Пользователь вводит свое имя пользователя и пароль (если они еще не вошли в систему google.com)
- google.com теперь представляет собой разрешение на безопасность: "api.prettypictures.com" хотел бы получить доступ к вашему адресу электронной почты, имени, жене, детям и т.д. Это нормально?
- Пользователь нажимает "Да" и возвращается к api.prettypictures.com/Account/ExternalLogin с файлом cookie, установленным Google.
Вот где я застрял. То, что должно произойти дальше, - это как-то клиентское приложение должно быть уведомлено о том, что пользователь успешно прошел аутентификацию с помощью google.com и ему был предоставлен код доступа для одного доступа, чтобы позднее обменять маркер доступа. Клиентское приложение должно иметь возможность, если необходимо, пригласить пользователя к имени пользователя, чтобы связать его с именем google.com.
Я не знаю, как это сделать.
Фактически в этот момент браузер заканчивается на конечной точке api.prettypictures.com/Account/ExternalLogin после обратного вызова от Google. API подписан для Google, но клиент не знает, как с этим бороться. Должен ли я передать этот файл cookie на www.webpics.com?
В приложении SPA это делается через AJAX, а google.com возвращает токен в виде фрагмента URL-адреса, и все работает хорошо, потому что все это находится на одном домене. Но это бросает вызов большей части того, что "API" может использовать несколько клиентов.
Help!