2016-08-30 28 views
5

Moje pytanie dotyczy specyfikacji how can i validate username password for mongodb authentication through pymongo?.Jak uciec @ w haśle w połączeniu pymongo?

Próbuję połączyć się z instancją MongoDB za pomocą PyMongo 3.2.2 i adresu URL zawierającego użytkownika i hasło, jak wyjaśniono w MongoDB Docs. Różnica polega na tym, że używane przeze mnie hasło zawiera znak "@".

Na początku po prostu starał się połączyć bez ucieczki, tak:

prefix = 'mongodb://'

user = 'user:[email protected]_'

suffix = '@127.0.0.1:27001/'

conn = pymongo.MongoClient(prefix + user + suffix)

Naturalnie mam następujący błąd:

InvalidURI: ':' or '@' characters in a username or password must be escaped according to RFC 2396. 

Więc próbowałem uciec użytkownika: przekazać część korzystając urllib.quote() jak to:

prefix = 'mongodb://'

user = urllib.quote('user:[email protected]_')

suffix = '@127.0.0.1:27001/'

conn = pymongo.MongoClient(prefix + user + suffix)

, ale potem otrzymałem:

OperationFailure: Authentication failed. 

(Ważne, aby powiedzieć, że przy użyciu GUI Management Tool MongoDB (Robomongo, jeśli to ma znaczenie) Jestem w stanie połączyć się z MongoDB użyciu (Real) adres i poświadczeń.)

zmienna użytkownika Drukowanie w powyższym kodzie wygenerowany został ciąg znaków 'user:passw_with_%40_' (czyli "@" stał się "% 40") i zgodnie z wikipedia jest to oczekiwany efekt ucieczki.

Próbowałem nawet uniknąć znaku @ za pomocą pojedynczych i podwójnych ukośników (user = 'user:passw_with_\\@_' i user = 'user:passw_with_\@_'), ale te nie powiodły się z wyjątkiem wyjątku InvalidURI.

TL; DR;

Moje pytanie brzmi: Jak mogę uciec "@" w części hasła adresu URL MongoDB?

Odpowiedz

11

Powinieneś być w stanie uciec przed hasłem za pomocą urllib.quote(). Chociaż powinieneś podawać tylko/uciec z hasła i wykluczyć username:; w przeciwnym razie : również zostanie zmienione na %3A.

Na przykład

import pymongo 
import urllib 

mongo_uri = "mongodb://username:" + urllib.quote("[email protected]") + "@127.0.0.1:27001/" 
client = pymongo.MongoClient(mongo_uri) 

Powyższy fragment badano na MongoDB v3.2.x Python v2.7 i PyMongo v3.2.2.

W powyższym przykładzie założono w MongoDB URI connection string:

  • Użytkownik jest tworzony w bazie danych admin.
  • Gospodarz mongod działa na to 127.0.0.1 (localhost)
  • Port mongod przypisany jest 27001
+6

Python 3: 'urllib.parse.quote' – luckydonald