Заголовок, наверное, не совсем отражает суть моего ступора. А проблема вот в чём: начал я делать web-движок, основанный на API. И всё бы хорошо, но подошёл тот момент, когда требуется работа с API другим сервисам(непроверенным). Проблема в том, что, авторизировавшись на стороннем сервисе, пользователь окажется в опасности, т.к. соронний сервис сможет выполнить любые действия от пользователя. Знаю, что есть OAuth и тому подобные, но хотелось бы самому сделать таковую систему. Не подскажите, где прочитать?
Пользователь заходит на сторонний сервис и чтобы авторизировать пользователя сервис делает запрос типа: http://api.****.su/?method=login.login&data={"email":"****","password":"******"}&sid=SID12345
и получает некий ответ, но ведь сервис может сохранить логин и пароль да и вообще любые действия от имени пользователя производить.
Сервис должен делать запрос вида api.****.su/?token=***&method=***&data=***, авторизация — по токену. Другому сервису достается только токен, логин и пароль вводятся на стороне вашего сайта.
Подробнее все написано в протоколе OAuth — он решает именно эту задачу.
Ну вот простой пример:
Форма авторизации ведет на ваш домен,
входные данные:
логин, пароль, куда вернуть (при желании токен, время жизни запроса и т.д.)
Проверяете данные, если все верно делаете редирект,
отправляете приемной стороне данные:
логин, hash = md5 ( имя пользователя + соль известная только вам и приемной стороне)
Приемная сторона проверяет имя и сверяет хэш, если хэш верный она удостоверяется, что пользователь тот кто он есть, если неверный возвращаем код ошибки.
Я в подобной ситуации в хэш добавлял IP клиента, его user-agent, время жизни, токен и все данные подписывал URL signer от атак MITM
Берите OAuth 2 legged. Очень простое решение на базе preshared key (общего пароля). Есть библиотеки как для клиента так и для сервера. У меня pure-php код (без использования каких-либо) библиотек не весил и 10 килобайт.
http и открытый пароль в GET? О какой безопасности тут вообще может идти речь?
А в целом мой совет — послушайте людей, воспользуйтесь готовыми решениями и не изобретайте велосипед. Особенно когда для его изобретения требуются знания в области безопасного взаимодействия между различными сервисами.
Хотелось бы не получить результат, подключением сторонних библиотек, а всё таки самому дойти до этого и сделать. Конечно, не лучший вариант для продакшн, но всё же…