programing

pymongo 연결에서 암호로 @를 탈출하는 방법은 무엇입니까?

starjava 2023. 6. 21. 22:01
반응형

pymongo 연결에서 암호로 @를 탈출하는 방법은 무엇입니까?

제 질문은 제가 어떻게 pymongo를 통해 mongodb 인증을 위한 사용자 이름 비밀번호를 검증할 수 있는지에 대한 명세입니다.

MongoDB Docs에서 설명한 대로 PyMongo 3.2.2와 사용자와 비밀번호가 포함된 URL을 사용하여 MongoDB 인스턴스에 연결하려고 합니다.다른 점은 제가 사용하고 있는 비밀번호에 '@'가 포함되어 있다는 것입니다.

처음에는 탈출하지 않고 간단하게 연결하려고 했습니다.

접두사 = 'mongodb://'

사용자 = '사용자:passw_with_@_'

접미사 = '@127.0.0.1:27001/'

conn = 피몽고.MongoClient(접두사 + 사용자 + 접미사)

당연히 다음과 같은 오류가 발생했습니다.

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

그래서 urllib를 사용하여 user:pass part를 탈출하려고 했습니다.인용문은 다음과 같습니다.

접두사 = 'mongodb://'

사용자 = urllib.인용문("사용자:passw_with_@_")

접미사 = '@127.0.0.1:27001/'

conn = 피몽고.MongoClient(접두사 + 사용자 + 접미사)

하지만 전 다음과 같은 걸 받았어요.

OperationFailure: Authentication failed.

(GUI MongoDB Management Tool(Robomongo, 문제가 되는 경우)을 사용하여 (실제) 주소와 자격 증명을 사용하여 MongoDB에 연결할 수 있습니다.)

위의 코드에서 사용자 변수를 인쇄하는 중에 다음이 생성되었습니다.'user:passw_with_%40_'문자열(즉 '@'이 '%40'이 됨)과 위키피디아에 따르면 탈출이 예상됩니다.

저는 싱글 백슬래시와 더블 백슬래시로 @를 탈출하기도 했습니다.user = 'user:passw_with_\\@_'그리고.user = 'user:passw_with_\@_'), 그러나 잘못된 것으로 실패한 것들.URI 예외입니다.

TL;DR;

제 질문은:MongoDB URL의 암호 부분에서 '@'를 이스케이프하려면 어떻게 해야 합니까?

다음을 사용하여 암호를 벗어날 수 있습니다.urllib.quote()암호를 따옴표로 묶거나 이스케이프해야 하지만,username:그렇지 않으면:로도 탈출할 것입니다.%3A.

예:

import pymongo 
import urllib 

mongo_uri = "mongodb://username:" + urllib.parse.quote("p@ssword") + "@127.0.0.1:27001/"
client = pymongo.MongoClient(mongo_uri)

위의 스니펫은 MongoDB v3.2.x 및 PyMongo v3.2.2에 대해 테스트되었습니다.

위의 는 MongoDB URI 연결 문자열에서 가정되었습니다.

  • 사용자는 에서 생성됩니다.admin데이터베이스
  • 호스트mongod에서 실행 중: 127.0.0.1(localhost)
  • 항구mongod에 할당된 값은 27001입니다.

mlab 인스턴스에 연결하기 위한 Python 3.6.5 - PyMongo 3.7.0 버전:

from pymongo import MongoClient
import urllib.parse

username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus('password')
client = MongoClient('mongodb://%s:%s@ds00000.mlab.com:000000/recipe_app_testing' % (username, password))

이것이 플라스크-피몽고 스핀업 앱을 사용하지 않고 mlab MongoDB 인스턴스에 연결할 수 있는 유일한 방법입니다. 유닛 테스트를 위한 고정 장치를 만들어야 했습니다.

Python 3.6.5 - PyMongo 3.7.0 localhost 버전:

from pymongo import MongoClient
import urllib.parse 

username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus('password')
client = MongoClient('mongodb://%s:%s@127.0.0.1:27001/' % (username, password))

터미널에서 실행:

python -m pip install pymongo[srv]

python 파일:

import pymongo
from pymongo import MongoClient
import urllib.parse

username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus("password")

url = "mongodb+srv://{}:{}@cluster0-0000.mongodb.net/<dbname>?retryWrites=true&w=majority".format(username, password)
# url is just an example (your url will be different)

cluster = MongoClient(url)
db = cluster['Sample']
collection = db['temporary']

MongoDB 암호에 '@'가 있고 URI와 연결하려면 다음을 사용하여 암호를 바꾸기만 하면 됩니다.

%40

단순한 정보:

MongoDB, Pymongo 및 Mongo 엔진은 암호에 있는 여러 기호를 처리할 수 없습니다.

Windows용 데이터베이스 이름 제한

/\. "$*<>:|?

Unix 및 Linux 시스템의 데이터베이스 이름 제한

/\. "$

https://docs.mongodb.com/manual/reference/limits/ #필드 이름 제한

이스케이프는 잘못된 기호를 포함할 때 작동하지 않습니다.

언급URL : https://stackoverflow.com/questions/39237813/how-to-escape-in-a-password-in-pymongo-connection

반응형