Подтвердить что ты не робот

Как аутентифицировать пользователей 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

4b9b3361

Ответ 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 с почтовым запросом на сервер. Это имеет смысл?