Я хотів би мати таку архітектуру (для цього прикладу я склав назву продукту):
Додаток 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.
Я вивчив більшість документів, доступних у процесі аутентифікації, наприклад:
Я прочитав майже все, що можу, про нову модель ідентичності в 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 .
Я не знаю, як сприяти цьому.
Насправді на цей момент браузер після зворотного дзвінка від Google закінчується сідати на кінцеву точку api.prettypictures.com/Account/ExternalLogin . API ввійшов у систему Google, але клієнт не знає, як з цим боротися. Чи слід передавати цей файл cookie назад на www.webpics.com ?
У програмі SPA це робиться через AJAX, і google.com поверне маркер у вигляді фрагмента URL-адреси, і все це чудово працює, оскільки все це знаходиться в одному домені. Але це суперечить більшій частині сенсу наявності "API", який можуть повною мірою використовувати багато клієнтів.
Допоможіть!