পাইথন, এইচটিটিপিএস বেসিক প্রমাণীকরণের সাথে পেয়েছে


90

আমি পাইথন ব্যবহার করে মৌলিক প্রমাণীকরণের সাথে একটি এইচটিটিপিএস জেট করার চেষ্টা করছি। আমি অজগর থেকে খুব নতুন এবং গাইডগুলি জিনিসগুলি করতে বিভিন্ন লাইব্রেরি ব্যবহার করে বলে মনে হচ্ছে। (http.client, httplib এবং urllib)। কেহ আমাকে দেখাতে পারে কিভাবে এটি সম্পন্ন? আপনি কীভাবে ব্যবহার করতে স্ট্যান্ডার্ড লাইব্রেরি বলতে পারেন?


4
আপনি কি শংসাপত্রটি বৈধ কিনা তা নিশ্চিত করতে চান?
অ্যান্ড্রু কক্স

4
পরীক্ষা করে দেখুন stackoverflow.com/questions/635113/... । মনে হচ্ছে আপনি যা খুঁজছেন ঠিক তা coverেকে দেবে।
জিও

উত্তর:


122

পাইথন 3 এ নিম্নলিখিতটি কাজ করবে। আমি স্ট্যান্ডার্ড লাইব্রেরি থেকে নিম্ন স্তরের http.client ব্যবহার করছি । মৌলিক অনুমোদনের বিশদ জানতে rfc2617 এর 2 অনুচ্ছেদটিও দেখুন । এই কোডটি শংসাপত্রটি বৈধ কিনা তা পরীক্ষা করবে না তবে এটি একটি https সংযোগ স্থাপন করবে connection এটি কীভাবে করা যায় তার জন্য http.client ডক্স দেখুন ।

from http.client import HTTPSConnection
from base64 import b64encode
#This sets up the https connection
c = HTTPSConnection("www.google.com")
#we need to base 64 encode it 
#and then decode it to acsii as python 3 stores it as a byte string
userAndPass = b64encode(b"username:password").decode("ascii")
headers = { 'Authorization' : 'Basic %s' %  userAndPass }
#then connect
c.request('GET', '/', headers=headers)
#get the response back
res = c.getresponse()
# at this point you could check the status etc
# this gets the page text
data = res.read()  

4
requestপদ্ধতি ডকুমেন্টেশন [1] উল্লেখ করেছেন যে ISO-8859-1- ", HTTP এর জন্য ডিফল্ট অক্ষরসেট" "স্ট্রিং হিসাবে এনকোডেড থাকে"। সুতরাং আমি "ASCII" এর পরিবর্তে "ISO-8859-1" দিয়ে ডিকোড করার পরামর্শ দিই। [1] ডকস.প্যাথন.আর.৩ / ৩
লাইব্রেরি

22
পরিবর্তে ভেরিয়েবল ব্যবহার করার জন্য b"username:password", ব্যবহার করুন: bytes(username + ':' + password, "utf-8")
কেনোরব 3'15

4
@ jgomo3: .decode("ascii")কেবলমাত্র bytes-> strরূপান্তরকরণের জন্য। এর ফলাফল b64encodeকেবলমাত্র ASCII- এর।
টর্স্টেন ব্রোঞ্জার

4
আমার রক্ষাকর্তা. 4 ঘন্টা লড়াইয়ের পরে এবং মিস-দিকের বোঝা।
কনরাড বি

আমি কীভাবে ডিফল্ট শংসাপত্রগুলি ব্যবহার করব ?, আমি অন্য সিস্টেমে কোডটি সঠিকভাবে চালালে এই কাজ করবে না?
অন্ধু

93

পাইথনের শক্তি ব্যবহার করুন এবং আশেপাশের সেরা একটি গ্রন্থাগারের উপর ঝুঁকুন: অনুরোধ

import requests

r = requests.get('https://my.website.com/rest/path', auth=('myusername', 'mybasicpass'))
print(r.text)

পরিবর্তনশীল আর (অনুরোধের প্রতিক্রিয়া) এর সাথে আপনি ব্যবহার করতে পারেন এমন আরও অনেকগুলি প্যারামিটার রয়েছে। ইন্টারেক্টিভ ইন্টারপ্রেটারে পপ করা এবং এটির সাথে চারপাশে খেলতে এবং / অথবা অনুরোধগুলির ডকগুলি সর্বাধিক ভাল হয়।

ubuntu@hostname:/home/ubuntu$ python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get('https://my.website.com/rest/path', auth=('myusername', 'mybasicpass'))
>>> dir(r)
['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'iter_content', 'iter_lines', 'json', 'links', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url']
>>> r.content
b'{"battery_status":0,"margin_status":0,"timestamp_status":null,"req_status":0}'
>>> r.text
'{"battery_status":0,"margin_status":0,"timestamp_status":null,"req_status":0}'
>>> r.status_code
200
>>> r.headers
CaseInsensitiveDict({'x-powered-by': 'Express', 'content-length': '77', 'date': 'Fri, 20 May 2016 02:06:18 GMT', 'server': 'nginx/1.6.3', 'connection': 'keep-alive', 'content-type': 'application/json; charset=utf-8'})

23

আপডেট: ওপি পাইথন 3 ব্যবহার করে So সুতরাং httplib2 ব্যবহার করে একটি উদাহরণ যুক্ত করুন

import httplib2

h = httplib2.Http(".cache")

h.add_credentials('name', 'password') # Basic authentication

resp, content = h.request("https://host/path/to/resource", "POST", body="foobar")

নীচে পাইথন ২.6 এর জন্য কাজ করে:

আমি এমন pycurlএকটি প্রক্রিয়ার জন্য উত্পাদনে প্রচুর পরিমাণে ব্যবহার করি যা প্রতিদিন 10 মিলিয়নের বেশি অনুরোধ করে does

আপনাকে প্রথমে নিম্নলিখিতটি আমদানি করতে হবে।

import pycurl
import cStringIO
import base64

বুনিয়াদি প্রমাণীকরণ শিরোনামের কিছু অংশে ব্যবহারকারীর নাম এবং পাসওয়ার্ড বেস 64 হিসাবে এনকোড করা থাকে।

headers = { 'Authorization' : 'Basic %s' % base64.b64encode("username:password") }

HTTP শিরোনামে আপনি এই লাইনটি দেখতে পাবেন Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=। আপনার ব্যবহারকারী নাম এবং পাসওয়ার্ডের উপর নির্ভর করে এনকোডযুক্ত স্ট্রিং পরিবর্তন হয় changes

আমাদের এখন আমাদের HTTP প্রতিক্রিয়া এবং কার্ল সংযোগ হ্যান্ডেলটি লিখতে একটি জায়গা দরকার।

response = cStringIO.StringIO()
conn = pycurl.Curl()

আমরা বিভিন্ন কার্ল অপশন সেট করতে পারি। বিকল্পগুলির একটি সম্পূর্ণ তালিকার জন্য, এটি দেখুন । লিঙ্কযুক্ত ডকুমেন্টেশনগুলি libcurl API এর জন্য, তবে অন্যান্য ভাষার বাইন্ডিংয়ের জন্য বিকল্পগুলি পরিবর্তন হয় না।

conn.setopt(pycurl.VERBOSE, 1)
conn.setopt(pycurlHTTPHEADER, ["%s: %s" % t for t in headers.items()])

conn.setopt(pycurl.URL, "https://host/path/to/resource")
conn.setopt(pycurl.POST, 1)

আপনার যদি শংসাপত্র যাচাই করার প্রয়োজন না হয়। সতর্কতা: এটি অনিরাপদ। চলমান curl -kবা curl --insecure

conn.setopt(pycurl.SSL_VERIFYPEER, False)
conn.setopt(pycurl.SSL_VERIFYHOST, False)

cStringIO.writeHTTP প্রতিক্রিয়া সংরক্ষণ করার জন্য কল করুন Call

conn.setopt(pycurl.WRITEFUNCTION, response.write)

যখন আপনি একটি পোস্ট অনুরোধ করছেন।

post_body = "foobar"
conn.setopt(pycurl.POSTFIELDS, post_body)

এখনই আসল অনুরোধ করুন।

conn.perform()

HTTP প্রতিক্রিয়া কোডের ভিত্তিতে কিছু করুন।

http_code = conn.getinfo(pycurl.HTTP_CODE)
if http_code is 200:
   print response.getvalue()

যে pyhthon 2.5 তোমার দর্শন লগ করা 3 ব্যবহার করার জন্য মনে করা হয়
টম Squires

আপনি কি সহজে ইনস্টল বা পাইপ ব্যবহার করছেন? পাইথারেল প্যাকেজটি অজগর 3 এর জন্য অনুপলব্ধ?
ওকাজ নায়ার্স

একটি httplib2 দিয়ে আপডেট হয়েছে। এটি অজগর 3 এর জন্য উপলভ্য
ওকাজ নায়ার্স

যারা নতুন তাদের জন্য: উপরের উদাহরণটিতে একটি বিন্দু অনুপস্থিত: "পাইকারুল.এইচটিটিপিএইডার" (আমি সম্পাদনা করব তবে এটি 1 অক্ষর এবং সর্বনিম্ন 6)।
গ্রিম উইকেটেড

ওপি পোষ্ট নয়, জিইটি বলেছেন
জো সি

17

শংসাপত্রের বৈধতা সহ পাইথন 3 এ বেসিক লেখার একটি সঠিক উপায় urllib.requestঅনুসরণ করা হয়েছে।

নোট যে certifiবাধ্যতামূলক নয়। আপনি নিজের ওএস বান্ডেলটি ব্যবহার করতে পারেন (সম্ভবত * নিক্স কেবল) বা মোজিলার সিএ বান্ডেলটি নিজে বিতরণ করতে পারেন । অথবা আপনি যে হোস্টগুলির সাথে যোগাযোগ করছেন তা যদি খুব কম হয় তবে নিজেকে হোস্টের সিএ থেকে কনেকেটেট সিএ ফাইল করুন, যা অন্য কোনও দূষিত সিএ দ্বারা সৃষ্ট এমআইটিএম আক্রমণের ঝুঁকি হ্রাস করতে পারে which

#!/usr/bin/env python3


import urllib.request
import ssl

import certifi


context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations(certifi.where())
httpsHandler = urllib.request.HTTPSHandler(context = context)

manager = urllib.request.HTTPPasswordMgrWithDefaultRealm()
manager.add_password(None, 'https://domain.com/', 'username', 'password')
authHandler = urllib.request.HTTPBasicAuthHandler(manager)

opener = urllib.request.build_opener(httpsHandler, authHandler)

# Used globally for all urllib.request requests.
# If it doesn't fit your design, use opener directly.
urllib.request.install_opener(opener)

response = urllib.request.urlopen('https://domain.com/some/path')
print(response.read())

এটা অসাধারণ. সরল পাঠ্য শংসাপত্রগুলি (HTTP বেসিক অথ) প্রেরণের সময় শংসাপত্র যাচাইকরণ গুরুত্বপূর্ণ important আপনার টিএলএস স্তর (এইচটিটিপিএস) তখন সুরক্ষিত রয়েছে তা আপনাকে নিশ্চিত করতে হবে কারণ আপনি সুরক্ষিত হওয়ার জন্য আপনি সেই স্তরটির উপর নির্ভর করছেন।
চারটি

সঠিক দেখাচ্ছে তবে আমার ক্ষেত্রে এটি কাজ করে নি, এটি ssl.SSLCertVerificationsError: [SSL: CERTIFICATE_VERIFY_FAILED] শংসাপত্র যাচাইকরণ ব্যর্থ হয়েছে: স্থানীয় ইস্যুকারী শংসাপত্র পেতে অক্ষম হয়েছে (_ssl.c: 1056)
নীলমেগ

যাচাইকরণের পরম এবং কুকিজ প্যারামে একটি বৈধ পেম শংসাপত্র দিয়ে আমি এটি অনুভব করেছি।
নীলমেগ

1

শুধুমাত্র মানক মডিউল এবং কোনও ম্যানুয়াল শিরোনাম এনকোডিং ব্যবহার করছে না

... যা মনে হয় এবং সবচেয়ে বহনযোগ্য উপায়

পাইথন urllib ধারণাটি হ'ল অনুরোধের অসংখ্য বৈশিষ্ট্যকে বিভিন্ন পরিচালক / পরিচালক / প্রসঙ্গে ভাগ করে ... যা তাদের অংশগুলি প্রক্রিয়া করে:

import urllib.request, ssl

# to avoid verifying ssl certificates
httpsHa = urllib.request.HTTPSHandler(context= ssl._create_unverified_context())

# setting up realm+urls+user-password auth
# (top_level_url may be sequence, also the complete url, realm None is default)
top_level_url = 'https://ip:port_or_domain'
# of the std managers, this can send user+passwd in one go,
# not after HTTP req->401 sequence
password_mgr = urllib.request.HTTPPasswordMgrWithPriorAuth()
password_mgr.add_password(None, top_level_url, "user", "password", is_authenticated=True)

handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
# create OpenerDirector
opener = urllib.request.build_opener(handler, httpsHa)

url = top_level_url + '/some_url?some_query...'
response = opener.open(url)

print(response.read())

0

কিছু অল্প উন্নতি সহ @ অ্যান্ড্রুকক্সের উত্তরের ভিত্তিতে:

from http.client import HTTPSConnection
from base64 import b64encode


client = HTTPSConnection("www.google.com")
user = "user_name"
password = "password"
headers = {
    "Authorization": "Basic {}".format(
        b64encode(bytes(f"{user}:{password}", "utf-8")).decode("ascii")
    )
}
client.request('GET', '/', headers=headers)
res = client.getresponse()
data = res.read()

দ্রষ্টব্য, আপনি যদি এর bytesপরিবর্তে ফাংশন ব্যবহার করেন তবে আপনার এনকোডিং সেট করা উচিত b""


-1
requests.get(url, auth=requests.auth.HTTPBasicAuth(username=token, password=''))

টোকেন সহ, পাসওয়ার্ড হওয়া উচিত ''

এটা আমার জন্য কাজ করে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.