2017-02-20 18 views
0

Я пытаюсь настроить базовую аутентификацию входа/пароля для репликации p2p.
Репликация отлично работает без аутентификации. Поэтому я уверен, что моя проблема связана с конфигурацией аутентификации.Что такое правильный способ настройки уровня авторизации для CouchbaseLite (CBLListener и CBLReplication) для репликации базы данных p2p?

CBListener конфигурации:

login = "my_login" 
password = "my_password" 

listener = CBLListener(manager: CBLManager.sharedInstance(), port: 55555) 
listener.setBonjourName(netServiceName, type: netServiceType) 
listener.readOnly = true 
listener.setPasswords([login : password]) 
try! listener.start() 

CBLReplication конфигурации:

let netService: NetService = ... // Got from NetServiceBrowserDelegate and NetServiceDelegate 

let components = NSURLComponents() 
components.scheme = "http" 
components.host = netService.hostName 
components.port = NSNumber(value: 55555) 
components.path = "/" + database.name 
components.user = login 
components.password = password  

let newReplication = database.createPullReplication(components.url!) 
newReplication.continuous = true 
newReplication.start() 

Вот что я получаю в Xcode консоли:

CBLRestPuller [http://my_login: ***** @ Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net]: В сети

CBLRestPuller [http://my_login: ***** @ Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net]: нет локальной контрольной точки; не получает удаленный один

CBLRestPuller [http://my_login: ***** @ Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net] Прогресс: установить активный = 1

CBLReplication [от http://my_login: **** *@Uladzimir-Papkos-iPad.local:. 55555/sg_to_firstfoundry_net]: активный, прогресс = 0/0, ERR: (нуль) ноль

CBLRestPuller [http://my_login: ***** @ Уладзимир-Papkos-IPAD .local.: 55555/sg_to_firstfoundry_net]: Состояние достижимости =: достижимое (20002), приостановлено = 0

: HTTP auth не удалось; отправлено Авторизация: Basic bXlfbG9naW46bXlfcGFzc3dvcmQ =; получил WWW-Authenticate: Дайджест области действия = "CouchbaseLite", QOP = "AUTH", нонса = "69773230-683C-4DCC-AB40-A21527A1F911"

CBLSocketChangeTracker [0x127d63810 sg_to_firstfoundry_net]: Не удается подключиться, отказавшись: CBLHTTP [401, http://my_login:*****@Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_changes?feed=normal&heartbeat=300000&style=all_docs] < --NSURLError [-1013, http://my_login:*****@Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_changes?feed=normal&heartbeat=300000&style=all_docs]

CBLRestPuller [http://my_login: ***** @ Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net]: ChangeTracker остановлен; ошибка = CBLHTTP [401, http://my_login:*****@Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_changes?feed=normal&heartbeat=300000&style=all_docs] < --NSURLError [-1013, http://my_login:*****@Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_changes?feed=normal&heartbeat=300000&style=all_docs]

Я думаю, что самое бревно вот эта строка:

: HTTP аутентификации не удалось; отправлено Авторизация: Базовый bXlfbG9naW46bXlfcGFzc3dvcmQ =; получил WWW-Authenticate: дайджест области действия = "CouchbaseLite", QOP = "AUTH", нонса = "69773230-683C-4DCC-AB40-A21527A1F911"

В качестве альтернативы я пытался использовать CBLAuthenticator вместо инъекций логин/пароль в URL.Тем не менее не работает, но я получаю различные сообщения об ошибках в журнале:
Что изменилось:

// Added: 
newReplication.authenticator = CBLAuthenticator.basicAuthenticator(withName: login, password: password) 

// Removed: 
components.user = login 
components.password = password 

Вот что я получаю в Xcode консоли после обновления кода:

CBLRestPuller [http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net]: Выход в интернет

CBLRestPuller [http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net] Прогресс: установить активный = 1

CBLRestPul ler [http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net]: Успешно вошел!

RemoteRequest: Добавлен Authorization заголовок для CBLPasswordAuthorizer [мой_логин/****]

CBLRemoteJSONRequest [GET http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_local/b3f625c9bddabfb59ee49d78f3bb484a5876b486]: Starting ...

DEALLOC CBLRemoteLogin [http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net] 2017-02-20 16:51: 28,335 Союз Дев [1922: 1702832] RemoteRequest: CBLRemoteSession начиная CBLRemoteJSONRequest [GET http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_local/b3f625c9bddabfb59ee49d78f3bb484a5876b486]

синхронизации: CBLReplication [от http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net]: активный, прогресс = 0/0, ERR: (нуль) щ л

CBLRestPuller [http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net]: Достижимость состояние =: достижима (20002), подвешенный = 0

RemoteRequest: Гот вызов для CBLRemoteJSONRequest [GET http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_local/b3f625c9bddabfb59ee49d78f3bb484a5876b486]: Метод = NSURLAuthenticationMethodHTTPDigest, ERR = (нуль)

RemoteRequest: задача: (фаза 3) continueWithoutCredential

Синхронизация: CBLRestPuller [http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net]: Сервер (нуль)

RemoteReque й: CBLRemoteJSONRequest [GET http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_local/b3f625c9bddabfb59ee49d78f3bb484a5876b486]: Получил ответ, статус 401

CBLRemoteJSONRequest [GET http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_local/b3f625c9bddabfb59ee49d78f3bb484a5876b486]: Получил ошибку CBLHTTP [401, "несанкционированным", http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_local/b3f625c9bddabfb59ee49d78f3bb484a5876b486]

синхронизации: CBLRestPuller [http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net]: Ошибка выборки последней последовательности: CBLHTTP [ 401, "несанкционированный", http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_local/b3f625c9bddabfb59ee49d78f3bb484a5876b486]

синхронизация: CBLRestPuller [http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net] Прогресс: установить ошибки = CBLHTTP [401, "несанкционированный", http://Uladzimir-Papkos-iPad.local.:55555/sg_to_firstfoundry_net/_local/b3f625c9bddabfb59ee49d78f3bb484a5876b486]

Может ли кто-нибудь указать мне, где я делаю что-то неправильно?

+0

Можете ли вы попытаться использовать аутентификатор на репликаторе явно вместо того, чтобы указывать имя пользователя и пароль через URL-адрес? Добавьте эту строку до начала репликации -> 'newReplication.authenticator = [CBLAuthenticator basicAuthenticatorWithName: login password: password];' (извините за синтаксис Obj-C) – borrrden

+0

Также этот вопрос уже сейчас: https: // форумы. couchbase.com/t/what-is-proper-way-to-setup-auth-layer-for-couchbaselite-cbllistener-and-cblreplication-for-p2p-database-replication/11838, поэтому этот вопрос SO, вероятно, останется без ответа, если он получает ответы на форумах) – borrrden

+0

@borrrden, спасибо за ответ. Да, я попробовал ваше предложение, получая разные сообщения в журнале, но аутентификация не работает. Я обновил вопрос с более подробной информацией о предложенном вами решении. –

ответ

0

После разговора с инженерами Couchbase было решено, что лучшим решением здесь является обеспечение безопасного HTTP-соединения, поскольку нет смысла отправлять логин/пароль через небезопасный HTTP-запрос.

Самый простой (не самый безопасный) способ включить HTTPS это делать дальше:

// Change url to https 
components.scheme = "https" 

// Inject self-signed generated on the fly certificate into CBLListener 
try listener.setAnonymousSSLIdentityWithLabel("use_any_string_here") 

Более подробная информация о настройке HTTPS соединения для репликации p2p доступна here.