http аутентификация в devise и rails 3 - PullRequest
10 голосов
/ 27 марта 2011

У меня есть приложение, которое использует devise on rails 3. Я хотел бы включить http-аутентификацию, чтобы я мог проходить аутентификацию в своем веб-приложении из приложения iPhone.Как я могу аутентифицироваться в своем приложении для iPhone, чтобы придумать?

Это безопасно или я должен проходить аутентификацию иначе?

Ответы [ 2 ]

6 голосов
/ 29 марта 2011

С точки зрения дизайна у вас есть 3 варианта:

1) Использовать базовую http-аутентификацию: у вашего приложения IPhone есть секретный ключ - который запекается в коде приложения IPhone - который используется для аутентификации каждого запроса с помощью веб-приложения. Поиск Google: «Разработать базовую аутентификацию http»

2) Вы можете использовать https, имея общедоступные сертификаты в приложении для iPhone и личные сертификаты в своем веб-приложении. Правильная настройка - это большая работа, она очень безопасна, поскольку ваше приложение IPhone и сервер Rails обмениваются сообщениями по зашифрованному каналу. Безопасность также прозрачна для вашего кода rails, поскольку аутентификация выполняется на транспортном уровне.

3) Приложение IPhone подключается к веб-приложению по протоколу https и получает токен аутентификации, который затем используется для совершения звонков в веб-приложение по обычному протоколу http. Более безопасный, чем 1, так как срок действия ключа может истечь, довольно много работы для реализации и очень масштабируемый. (http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/)

Большинство приложений используют решение 1.

Надеюсь, эта помощь.

РЕДАКТИРОВАТЬ: для реализации http-аутентификации (основной или дайджест) я предлагаю вам взглянуть на:

http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Basic.html а также https://github.com/plataformatec/devise/wiki/How-To:-Use-HTTP-Basic-Authentication

Точные шаги будут зависеть от вашего стека серверов Rails.

РЕДАКТИРОВАТЬ 2: Я не думаю, что Devise предоставляет способ получить auth_token. Я вижу, вы можете попробовать несколько решений:

  • когда пользователь входит на сервер, получает маркер authentication_token и помещает его в файл cookie. Не очень безопасно, если вы не зашифруете его с помощью общего секретного ключа.

  • вы можете предоставить веб-сервис https, который ваше приложение IPhone использует для получения токена пользователя. Ваше приложение для iPhone сделает запрос сразу после получения запроса пользователя на вход.

Извините, я не могу больше помочь с некоторым реальным кодом.

4 голосов
/ 04 апреля 2012

Это во многом зависит от того, как вы реализуете вещи на стороне сервера, но мы реализовали это, используя третий вариант Маттео.У меня есть реализация рельсов 3.1 с использованием устройства.Путь к входу в систему /users/login.json.Сначала создайте тело JSON для входа в систему с кодом, подобным следующему:

NSMutableDictionary *loginDictionary = [NSMutableDictionary dictionary];
NSMutableDictionary *usernamePasswordDictionary = [NSMutableDictionary dictionary];
[usernamePasswordDictionary setObject:username forKey:@"email"];
[usernamePasswordDictionary setObject:password forKey:@"password"];
[loginDictionary setObject:usernamePasswordDictionary forKey:@"user"];

NSData *data = [NSJSONSerialization dataWithJSONObject:loginDictionary options:0 error:&error];

, который дает этот JSON:

{"user":{"password":"blahblahblah","email":"admin@*****.com"}}

Я отправляю запрос POST url с кодом, подобным этому:

NSString *postUrlString = [NSString stringWithFormat:@"%@users/login.json", kServerAPIBaseURL];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:postUrlString] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:kTimeoutInterval];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];
[request setHTTPBody:data];

Ответ, который я получаю, содержит JSON.Мы настроили на стороне сервера возвращать a session_auth_token:

{
    admin = 1;
    "created_at" = "2012-01-25T00:15:58Z";
    "current_sign_in_at" = "2012-04-04T04:29:15Z";
    "current_sign_in_ip" = "75.163.148.101";
    email = "admin@******.com";
    "encrypted_password" = "*****";
    "failed_attempts" = 0;
    id = 1;
    "last_sign_in_at" = "2012-04-03T03:37:18Z";
    "last_sign_in_ip" = "75.163.148.101";
    "locked_at" = "<null>";
    name = "Joe Smith";
    "remember_created_at" = "2012-03-29T20:35:43Z";
    "reset_password_sent_at" = "<null>";
    "reset_password_token" = "<null>";
    "session_auth_token" = "3FRgX6CYlzQJGC8tRWwqEjFaMMFKarQAYKTy3u84M0U=";
    "sign_in_count" = 145;
    status = 1;
    "unlock_token" = "<null>";
    "updated_at" = "2012-04-04T04:29:15Z";
}

Мы храним этот session_auth_token и затем отправляем его обратно с каждым запросом в заголовке, что-то вроде этого:параметр [self sessionAuth] содержит session_auth_token.

Дайте мне знать, если вам нужны пояснения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...