পাইথন অনুরোধ: অনুমোদনের শিরোনাম বাদ দেওয়ার জন্য POST অনুরোধ


9

আমি পাইথন অনুরোধ লাইব্রেরি ব্যবহার করে একটি API পোস্ট অনুরোধ করার চেষ্টা করছি। আমি একটি Authorizationশিরোলেখার মধ্য দিয়ে যাচ্ছি তবে আমি যখন ডিবাগ করার চেষ্টা করব তখন আমি দেখতে পাচ্ছি যে শিরোনামটি বাদ পড়ছে। কী হচ্ছে তা আমার কোনও ধারণা নেই।

আমার কোডটি এখানে:

access_token = get_access_token()
bearer_token = base64.b64encode(bytes("'Bearer {}'".format(access_token)), 'utf-8')
headers = {'Content-Type': 'application/json', 'Authorization': bearer_token}
data = '{"FirstName" : "Jane", "LastName" : "Smith"}'
response = requests.post('https://myserver.com/endpoint', headers=headers, data=data)

আপনি উপরের দেখতে পারেন, আমি নিজে সেট Authorizationঅনুরোধ আর্গুমেন্ট হেডার, কিন্তু এটা প্রকৃত অনুরোধ এর হেডার হারিয়েছে: {'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.4.3 CPython/2.7.9 Linux/4.1.19-v7+'}

তথ্যের একটি অতিরিক্ত অংশ হ'ল আমি যদি পোষ্ট অনুরোধটিকে জিইটি অনুরোধে পরিবর্তন করি তবে শিরোনামটি Authorizationস্বাভাবিকভাবেই যায়!

কেন এই লাইব্রেরিটি পোস্টের অনুরোধগুলির জন্য শিরোনাম ছাড়বে এবং আমি কীভাবে এটি কাজ করব?

অনুরোধগুলির v2.4.3 ব্যবহার করে লাইব এবং পাইথন ২.7.৯

উত্তর:


10

TLDR

আপনি যে ইউআরএলটির জন্য অনুরোধ করছেন তা অন্য পোস্টের অনুরোধগুলিকে অন্য হোস্টে পুনঃনির্দেশ করার অনুরোধ জানায়, তাই অনুরোধ Authoriztionপাঠাগারটি আপনার শংসাপত্র ফাঁস হওয়ার ভয়ে শিরোনামটি হ্রাস করে । অনুরোধের Sessionক্লাসে আপনি দায়িত্বশীল পদ্ধতিটি ওভাররাইড করতে পারেন তা ঠিক করতে ।

বিস্তারিত

অনুরোধের ২.৪.৩-এ, যখন অনুরোধটি অন্য কোনও হোস্টে পুনঃনির্দেশিত হয় কেবল তখনই শিরোনাম reqeuestsসরিয়ে দেয় Authorizationএটি প্রাসঙ্গিক কোড :

if 'Authorization' in headers:
    # If we get redirected to a new host, we should strip out any
    # authentication headers.
    original_parsed = urlparse(response.request.url)
    redirect_parsed = urlparse(url)

    if (original_parsed.hostname != redirect_parsed.hostname):
        del headers['Authorization']

এর নতুন সংস্করণে requests,Authorization হেডার (উদাহরণস্বরূপ যদি পুনর্নির্দেশ একটি অ-নিরাপদ প্রটোকল কোনও সুরক্ষিত থেকে যায়) অতিরিক্ত ক্ষেত্রেই বাদ করা হবে না।

সুতরাং সম্ভবত আপনার ক্ষেত্রে যা ঘটে থাকে তা হ'ল আপনার পোষ্ট অনুরোধগুলি একটি অন্য হোস্টে পুনঃনির্দেশিত হয়। অনুরোধ লাইব্রেরি ব্যবহার করে পুনঃনির্দেশিত হোস্টের জন্য আপনি কেবল প্রমাণীকরণ সরবরাহ করতে পারেন, তা কোনও .netrcফাইলের মাধ্যমে । দুঃখের বিষয় এটি কেবল আপনাকে এইচটিটিপি বেসিক অ্যাথ ব্যবহার করতে দেবে, যা আপনাকে খুব বেশি সহায়তা করে না। সেক্ষেত্রে সর্বোত্তম সমাধানটি সম্ভবত সাবক্লাস requests.Sessionএবং এই আচরণটি ওভাররাইড করা, যেমন:

from requests import Session

class NoRebuildAuthSession(Session):
    def rebuild_auth(self, prepared_request, response):
        """
        No code here means requests will always preserve the Authorization
        header when redirected.
        Be careful not to leak your credentials to untrusted hosts!
        """

session = NoRebuildAuthSession()
response = session.post('https://myserver.com/endpoint', headers=headers, data=data)

সম্পাদন করা

আমি যখন এটি ঘটে তখন একটি সতর্কতা যুক্ত করতে গিথুবের অনুরোধ লাইব্রেরিতে একটি পুল-অনুরোধ খুলেছি । এটি মার্জ হওয়ার জন্য দ্বিতীয় অনুমোদনের জন্য অপেক্ষা করছে (তিন মাস আগেই))


1
ধন্যবাদ, এই সমস্যা ছিল!
user4184113

0

অনুরোধের নথিপত্রগুলি এটাই বলে:

Authorization headers set with headers= will be overridden if credentials are specified in .netrc, which in turn will be overridden by the auth= parameter. Authorization headers will be removed if you get redirected off-host.

আপনি কি আপনার অনুরোধে পুনঃনির্দেশিত হচ্ছেন?

যদি এটি হয় তবে পোস্টের অনুরোধে এই বিকল্পের সাথে পুনর্নির্দেশটি অক্ষম করার চেষ্টা করুন:

allow_redirects=False


allow_redirects=Falseকেবলমাত্র সার্ভারের অনুরোধিত পুনঃনির্দেশ অনুসরণ করতে অনুরোধগুলি আটকাবে। এটি অনুরোধটি সম্পূর্ণ করতে সাহায্য করবে না, এটি কেবল এটি মাঝখানে বন্ধ করবে।
কুমার্ক

0

প্রথম (এবং সম্ভবত আসল) সমস্যাটি আমি দেখতে পাচ্ছি তা হল আপনি কীভাবে তৈরি করবেন bearer_tokenকারণ আপনি কেবল নিজের টোকেনকেই এনকোডিং করছেন না তবে প্রমাণীকরণের ধরণটিও রয়েছে'Bearer'

আমি যেমন বুঝতে পেরেছি আপনাকে কেবল টোকনটি এনকোড করতে হবে এবং আপনার অনুরোধ শিরোনামের মধ্যে ফাঁকা প্রমাণীকরণ প্রকার + এনকোডড টোকন সরবরাহ করতে হবে:

bearer_token = str(base64.b64encode(access_token.encode()), "utf8")
headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer {}'.format(bearer_token)}

যদি এটি (এছাড়াও) কোনও পুনঃনির্দেশের সমস্যা হয় তবে আপনি কেবল সঠিক অবস্থানটি সন্ধান করতে পারেন এবং এই url এ আপনার অনুরোধ জানাতে POSTপারেন বা সার্ভার এটি স্বীকার করে নিলে আপনি নিজের শরীরের মধ্যে অ্যাক্সেস টোকেন প্রেরণ সম্পর্কে ভাবতে পারেন।


0

ডকুমেন্টেশন থেকে: Requests will attempt to get the authentication credentials for the URL’s hostname from the user’s netrc file. The netrc file overrides raw HTTP authentication headers set with headers=. If credentials for the hostname are found, the request is sent with HTTP Basic Auth.

যদি আপনাকে পুনঃনির্দেশিত করা হয় তবে আপনি ব্যবহারের চেষ্টা করতে পারেন allow_redirects=false


-1

আপনি শিরোনামগুলিতে একটি কাস্টম অনুমোদন ব্যবহার করার চেষ্টা করতে পারেন।

একটি কাস্টম প্রমাণীকরণ শ্রেণি সংজ্ঞায়িত করুন:

class MyAuth(requests.auth.AuthBase):
def __init__(self, bearer_token):
    self.username = None
    self.bearer_token = bearer_token

def __call__(self, r):
    r.headers['Authorization'] = self.bearer_token
    return r

তারপরে অনুরোধটি প্রেরণ করতে এটি ব্যবহার করুন:

headers = {'Content-Type': 'application/json'}

data = '{"FirstName" : "Jane", "LastName" : "Smith"}'

response = requests.post('https://myserver.com/endpoint', headers=headers, auth=MyAuth(bearer_token), data=data)

যদি এটি কাজ করে তবে দয়া করে উত্তরটি গ্রহণ করুন। বা আপনার যদি এখনও সমস্যা থাকে তবে আমাদের জানান। আশাকরি এটা সাহায্য করবে.


এর উত্তরাধিকারী হওয়ার দরকার নেই requests.auth.AuthBase। যদি আপনি এর উত্স কোডটি লক্ষ্য করেন তবে আপনি দেখতে পাবেন যে NotImplementedআপনি ওভাররাইড করতে ভুলে গেলে এটির যা কিছু হয় তা উত্থাপিত হয় __call__
মনিকা পুনরায় ইনস্টল করুন

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