Как аутентифицировать пользователей iOS/iPhone с удаленным веб-приложением и повторно использовать билет аутентификации в будущих запросах к одному и тому же веб-приложению?
Я создаю приложение iOS, и мне нужно иметь возможность делать аутентифицированные запросы в приложение Rails 3 для различных бит данных. Приложение Rails 3 использует omniauth и URL-адреса, такие как https://myapp.com/auth/facebook, чтобы, например, аутентифицировать пользователей через facebook... и после аутентификации хранит аутентификацию в защищенном файле cookie "auth." "
Что я хочу знать, как аутентифицировать моих пользователей из приложения iOS/iPhone, сохранить токен аутентификации и отправить его вместе с будущими запросами в приложение Rails?
Использование ASIHTTPRequest Я думаю о том, чтобы сделать что-то вроде этого:
-
Откройте UIWebview, загрузив URL-адрес из моего веб-приложения, определенного для провайдера, которому они хотят пройти аутентификацию (например, myapp.com/auth/facebook для facebook или myapp.com/auth/yahoo для yahoo и т.д.....).
-
В случае успеха, каким-то образом проанализируйте и сохраните файл cookie проверки подлинности в приложении iOS, не показывая веб-страницу, которую люди обычно видят при аутентификации через веб-сайт... и вместо этого закрывают UIWebView и переходят обратно в другой UIVewController в iOS приложение.
-
Каким-то образом включите сохраняемый токен аутентификации с будущими веб-запросами в приложение Rails.
-
Я также хочу, чтобы пользователи разрешали приложению iOS локально хранить эту информацию, поэтому им не нужно повторно подключаться к удаленному приложению, если они тоже выбирают.
Этот подход подходит? Есть ли способ лучше? И, конечно, как на самом деле реализовать выше?
Спасибо - wg
Ответы
Ответ 1
Использование OAuth довольно просто (хорошо, просто не слово...), но я сделал приложение iOS и java-сервер, который использует OAUth как схему идентификации, и, после полного цикла, я наконец-то привлек токен, идентифицирует этого пользователя и (как только можно получить доступ с использованием подписанных запросов) можно безопасно хранить в телефоне (я использую только стандартныеUserDefaults для его сохранения). Только ваше приложение (используя секрет) может подписать запросы.
Я не знаю, служит ли это вам...
Ах! После идентификации через веб-браузер браузер перенаправляет специальный URL-адрес (зарегистрированный для моего приложения), и URL-адрес открывает мое приложение, включая токен в его параметрах, поэтому легко получить токен после фазы идентификации в handleOpenURL.
Ответ 2
-
Как только UIWebview
выполнит аутентификацию с указанной службой, попробуйте загрузить другой URL (например: через javascript на странице, на которую служба возвращается после проверки подлинности).
-
Захват этого запроса с помощью объекта UIWebViewDelegate
, который реализует следующий метод протокола:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
-
Здесь у вас есть объект NSURLRequest
. Вы можете извлечь заголовки запроса NSDictionary
, который будет содержать данные cookie аутентификации, токен и т.д., Используя следующий метод NSURLRequest
- (NSDictionary *)allHTTPHeaderFields
Ответ 3
Для моего приложения это то, что я делаю.
Мое приложение использует устройство с omniauth для входа и использования пользователей.
Само по себе может генерировать уникальный токен с флагом token_authenticatable.
Поэтому при моем запросе на вход, если логин успешно завершен, я отвечаю с представлением JSON моего пользователя и моего токена пользователя. Я сохраняю все это в памяти телефона.
Затем по каждому запросу я добавляю параметр auth_token = MY_USER_TOKEN.
И что об этом.
У меня возникла проблема с авторизацией в Facebook, потому что я использую IOS facebook SDK, поэтому я пересылаю токен FB в свое приложение, проверяю его, а затем возвращаю тот же метод auth_token для всех следующих запросов.
Ответ 4
Хорошо, вот мы идем, я не знаю точную настройку вашего веб-сервиса и все такое, но то, что вы можете сделать, это хранить токен аутентификации на устройстве с использованием SQLite или Core Data, в настоящее время я работаю над приложением, которое требует аутентификация и то, что я делаю, это локальное хранение имени пользователя и пароля на устройстве в SQLite db с использованием Core Data для взаимодействия с db, тогда всякий раз, когда я вызываю вызовы API, я использую имя пользователя и пароль для проверки подлинности на стороне сервера используя get, но я считаю, что это заставка с использованием сообщения, если у веб-сервера отличная безопасность. Я не верю, что существует риск для безопасности. В чем я понимаю, что вы строите, я бы аутентифицировал пользователя при первом запуске, и пользователь сможет изменить учетные данные на более позднем этапе, но после проверки подлинности я вернул бы токен аутентификации на устройство и сохранил это в db, а затем всякий раз, когда мне нужно пройти аутентификацию с помощью веб-службы, я бы послал токен auth с почтовым запросом на сервер. Это имеет смысл?