2015-10-21 2 views
1

У меня есть следующая архитектура: клиент iOS использует NSURLConnection с willSendRequestForAuthenticationChallenge для авторизации с помощью службы REST на основе Django-rest-framework. Он работает нормально, когда логин только ascii, но когда я использую буквы без ascii, он даже не отправляет HTTP_AUTHORIZATION!Обработка входных данных без входа в систему при доступе к RESTful django из iOS с http auth

Возможно, это связано с тем, что RFC не охватывает символы не-ascii в базовом auth HTTP.

Каков наилучший способ его решения? Будет ли переваривать авторизацию?

Я не могу кодировать логин для URL-адреса, так как я не хочу, чтобы он отображался в журналах сервера. И я также хочу остаться с willSendRequestForAuthenticationChallenge.

PS: Я могу использовать форму на основе аутентификация или JSON-основанном на Django стороны (по реализации BaseAuthentication), но на прошивке мне нужно будет создать NSURLAuthenticationChallenge, который, кажется, большое дело

ответ

1

Как правило, вы бы из удачи и с HTTP Basic & Дайджест-аутентификация, это всего лишь символы ASCII, и просто нет возможности обойти это.

Однако, поскольку вы управляете бэкенд, то вы можете использовать этот трюк: кодировать как имя пользователя и пароль в base64 на стороне IOS, как это:

NSData *usernameData = [username dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *usernameBase64 = [usernameData base64EncodedStringWithOptions:0]; 

Затем создать свой NSURLCredential с закодированными строками , Поскольку базовая аутентификация HTTP уже кодирует учетные данные в base64, сделав это, вы будете сначала кодировать учетные данные перед отправкой их на сервер.

Теперь на стороне DRF создайте подкласс BasicAuthentication и назовите его Base64BasicAuthentication, например. Override authenticate_credentials так:

def authenticate_credentials(self, userid, password): 
    userid = base64.b64decode(userid) 
    password = base64.b64decode(password) 
    return super(Base64BasicAuthentication, self).authenticate_credentials(userid, password) 

А затем просто использовать Base64BasicAuthentication в качестве стандартного класса авторизации в Django REST Framework. Это немного взломать, но он должен выполнить эту работу.