Вопросы о потреблении вашего собственного API с помощью OAuth
Я создаю RESTful API для проекта, над которым я работаю, и хотел бы, чтобы основное приложение потребляло API, потому что:
- Это приведет к тому, что один набор кода будет поддерживать
- Если мы решим разоблачить API для сторонних разработчиков, это уже будет сделано
- Это открывает возможность сделать мобильные приложения, которые его потребляют.
- Я действительно хочу узнать, как это сделать.
API будет размещен на субдомене https://api.example.com
, а основное веб-приложение будет размещено в корневом домене https://example.com
.
Концептуально я понимаю, как все работает, но мой главный вопрос заключается в том, как поток аутентификации изменится, если вообще. Обычно сторонние приложения:
- Получить токен запроса из
https://api.example.com/request_token
- Перенаправить пользователя для аутентификации на
https://api.authenticate.com/authorize
- Получить перенаправление обратно в стороннее приложение
- Получить токен доступа из
https://api.example.com/access_token
Поскольку я контролирую оба домена, могу ли я сделать что-то похожее на:
- Получить токен запроса, когда пользователь приземляется на экране входа в систему
https://www.example.com
- Пользователь аутентифицируется с использованием формы на
https://www.example.com
, которая вызывает тот же код, что и https://api.example.com/authorize
- Если учетные данные действительны, токен запроса заменяется на токен доступа
- Маркер доступа сохраняется в сеансе и истекает, когда пользователь выходит из него, как обычно,
Шаг 3 чувствует себя неправильно, так как будет дублированный код, но разве он не откроет меня для атак XSS, это форма входа в систему на https://www.example.com
отправила данные в https://api.example.com
, так как они являются технически разными доменами?
Неужели я слишком сильно себя чувствую?
Ответы
Ответ 1
Я столкнулся с той же проблемой и решил ее так.
1
Для сторонних приложений, использующих мой API, они должны аутентифицироваться через OAuth для всех запросов.
2
Для моих собственных сторонних клиентов (мобильный, AIR и т.д.) Они используют OAuth, с той разницей, что я разрешаю им отправлять имя пользователя и пароль непосредственно на этапе авторизации (чтобы я мог создать собственный диалог входа в систему). Это обеспечивается тем, что ваш API работает через SSL/HTTPS.
3
Для моего веб-приложения я использую аутентификацию cookie для доступа к API. I. После входа в систему пользователь может просто вызвать API: URL-адреса и вернуть JSON/XML. Приятно также быстро изучить API-интерфейсы (хотя настоящая API-консоль, такая как APIGee, делает лучшую работу там).
Ответ 2
Я бы сказал, что вы немного его немного смущаете. Если ваш код разделен правильно, вы можете легко создать тонкий слой REST поверх уровня обслуживания приложений, а ваши контроллеры приложений будут тонким слоем поверх вашего уровня обслуживания.