Я разработал такую функцию для своего приложения. Пользователь может войти через Facebook или Twitter на нашем веб-сайте, и они также могут аутентифицировать себя в нашем API из приложения iPhone / Android.
Я не уверен, что мой метод лучший, поэтому я задал вопрос о том, что может быть лучшим подходом. Тем не менее, я собираюсь объяснить, что я делаю, и пока это работает очень хорошо.
Во-первых, вам нужно реализовать метод login
в вашем API. Этот метод обменивает ваши учетные данные на токен API, который затем будет использоваться для всех будущих вызовов.
Вот API-вызов login
с вашими основными параметрами аутентификации:
http://login:password@api.myapp.com/login
(это просто представление, объясняющее, что вы отправляете учетные данные, а не фактический способ сделать это)
В ответ этот вызов API отправляет вам api_token
{ "api_token": "xxxx-xxxx-xxxx-xxxx" }
На стороне сервера, у вас есть таблица, связывающая api_token
и user_id
(а также срок действия, если необходимо, и т. Д.)
Затем вы будете использовать api_token
каждый раз, когда вам нужно будет выполнить аутентифицированный вызов:
http://api.myapp.com/request?api_token=xxxx-xxxx-xxxx-xxxx
Теперь, когда вы изменили реализацию аутентификации, вы будете делать то же самое с Facebook access_token
, отправленным обратно SDK Facebook Connect. Вы обмениваетесь токенами, используя следующий вызов API:
http://api.myapp.com/login/facebook?access_token=<facebook_access_token>
На стороне сервера, вы проверяете действительность access_token
с помощью простого
wget -qO- https://graph.facebook.com/me?access_token=<facebook_access_token>
который отправляет вам обратно JSON со всей информацией пользователя, включая идентификатор пользователя Facebook. Предполагая, что пользователь уже подключил свою учетную запись к Facebook, вы можете найти user_id
и отправить обратно api_token
.
Проблема в том, что если пользователь отклонит ваше приложение из Facebook, это не повлияет на api_token
и пользователь все равно будет иметь доступ к API. Могут также быть некоторые проблемы с безопасностью (https, безусловно, будет лучше защитить маркер доступа пользователя к Facebook).
Я не могу ручаться за красоту этого метода, но он работает и может использоваться со многими другими поставщиками. Поскольку маркер доступа Facebook находится в той же экосистеме, я уверен, что это не нарушает TOS Facebook. Я ничего не читал, глядя на это.