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


95

আমার কাছে একটি অনুরোধ ইউআরআই এবং একটি টোকেন রয়েছে। যদি আমি ব্যবহার করি:

curl -s "<MY_URI>" -H "Authorization: TOK:<MY_TOKEN>"

ইত্যাদি, আমি 200 পাই এবং সংশ্লিষ্ট JSON ডেটা দেখি। সুতরাং, আমি অনুরোধগুলি ইনস্টল করেছি এবং যখন আমি এই সংস্থানটি অ্যাক্সেস করার চেষ্টা করি তখন আমি একটি 403 পাই কারণ সম্ভবত আমি সেই টোকনটি পাস করার জন্য সঠিক বাক্য গঠন জানি না। কেউ কি আমাকে এটি বুঝতে সাহায্য করতে পারে? এটি আমার কাছে রয়েছে:

import sys,socket
import requests

r = requests.get('<MY_URI>','<MY_TOKEN>')
r. status_code

আমি ইতিমধ্যে চেষ্টা করেছি:

r = requests.get('<MY_URI>',auth=('<MY_TOKEN>'))
r = requests.get('<MY_URI>',auth=('TOK','<MY_TOKEN>'))
r = requests.get('<MY_URI>',headers=('Authorization: TOK:<MY_TOKEN>'))

তবে এগুলির কোনওটিই কাজ করে না।

উত্তর:


112

অজগরে:

('<MY_TOKEN>')

সমতুল্য

'<MY_TOKEN>'

এবং ব্যাখ্যার জন্য অনুরোধ

('TOK', '<MY_TOKEN>')

আপনি যেমন বেসিক প্রমাণীকরণ ব্যবহার এবং অনুরোধের মতো একটি অনুমোদনের শিরোনাম ক্র্যাফ্ট করার অনুরোধগুলি চান:

'VE9LOjxNWV9UT0tFTj4K'

যা বেস 64 প্রতিনিধিত্ব করে 'TOK:<MY_TOKEN>'

আপনার নিজের শিরোনামটি পাস করার জন্য আপনি একটি অভিধানে পাস করুন:

r = requests.get('<MY_URI>', headers={'Authorization': 'TOK:<MY_TOKEN>'})

ট্রেসব্যাক (সর্বশেষতম কলটি শেষ): ফাইল "<stdin>", লাইন 1, <মডুল> ফাইলের মধ্যে "/ লাইব্রেরি / ফ্রেমওয়ার্কস / পাইথন.ফ্রেমওয়ার্ক / সংস্করণ / 2.7/lib/python2.7/site-packages/requests/api .py ", 55 নং লাইনে, রিটার্নের অনুরোধে ('পান', url, ** কোয়ার্গস) ফাইল" / লাইব্রেরি / ফ্রেম ওয়ার্কস / পাইথন.ফ্রেমওয়ার্ক / ভার্সন / ২./ / লিবি / পাইথন ২..7/সাইট- প্যাকেজস / রিকুইয়েস্টস / অ্যাপি .py ", লাইন 44, অনুরোধে রিটার্ন সেশন.প্রয়োজন (পদ্ধতি = পদ্ধতি, ইউআরএল = ইউআরএল, ** কোয়ার্গস) ফাইল" / লাইব্রেরি / ফ্রেমওয়ার্কস / পাইথন.ফ্রেমওয়ার্ক / সংস্করণ / 2.7/lib/python2.7/ite-packages /requests/sessions.py ", 323 লাইন, অনুরোধে PR = self.prepare_request (req)

@rebHelium আপনি পারেন সারকথা যে? এটি পুরো স্ট্যাক ট্রেস নয় এবং আপনি আসলে কী চেষ্টা করেছেন তার কোনও ইঙ্গিত নেই।
আয়ান স্ট্যাপলটন কর্ডাসকো

দুঃখিত, স্ট্যাক ওভারফ্লো আমাকে পুরো আউটপুট পোস্ট করার অনুমতি দেয়নি। আমি আপনার পরামর্শ মতো ঠিক করেছি: r = অনুরোধ.get ('আমার কাছে ইউআরএল যাই হোক না কেন', শিরোনাম = {'অনুমোদন': 'টোক: আমার কাছে যা কিছু আছে টোকেন'})

দুঃখ প্রকাশ করার দরকার নাই. এটা কি কাজ করেছিল? আপনি আমার উত্তর গ্রহণ করেছেন তবে মনে হয় এটি আপনার জন্য ব্যতিক্রম ঘটেছে। আপনি যদি কোনও সংক্ষেপ তৈরি করেন তবে আমি এখানে কথোপকথন করার চেয়ে আরও সহজেই আপনাকে সহায়তা করতে পারি।
আয়ান স্ট্যাপলটন কর্ডাসকো

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

37

আমি অনুরূপ কিছু খুঁজছেন এবং জুড়ে এসেছিল ছিল এই । আপনার উল্লেখ করা প্রথম বিকল্পটি দেখে মনে হচ্ছে এটি

r = requests.get('<MY_URI>', auth=('<MY_TOKEN>'))

"লেখক" দুটি পরামিতি নেয়: ব্যবহারকারীর নাম এবং পাসওয়ার্ড, সুতরাং আসল বিবৃতি হওয়া উচিত

r=requests.get('<MY_URI>', auth=('<YOUR_USERNAME>', '<YOUR_PASSWORD>'))

আমার ক্ষেত্রে, কোনও পাসওয়ার্ড ছিল না, সুতরাং আমি লেখার ক্ষেত্রের দ্বিতীয় প্যারামিটারটি নীচের মতো দেখলাম খালি রেখেছি:

r=requests.get('<MY_URI', auth=('MY_USERNAME', ''))

আশা করি এটি কারও সাহায্য করবে :)


4
আপনি চেষ্টা করুন r = requests.get('<MY_URI>',auth=('<MY_TOKEN>')), আপনি পাবেন TypeError: 'str' object is not callable। আমি
এগুলি

আপনার সংক্ষিপ্ত বিবরণ আমাকে সাহায্য করেছে তবে আপনি যে লিঙ্কটি পেয়েছেন তা পুনরায় পড়ার পরে। অনুরোধগুলি থেকে HTTPBasicAuth আমদানির সাথে কাজ করা.আউথ এটি খুব সহজ করে তোলে!
ওয়াল্লেম 89

26

এটি আমার পক্ষে কাজ করেছে:

access_token = #yourAccessTokenHere#

result = requests.post(url,
      headers={'Content-Type':'application/json',
               'Authorization': 'Bearer {}'.format(access_token)})

16

আপনি পুরো সেশনের জন্য শিরোনামও সেট করতে পারেন:

TOKEN = 'abcd0123'
HEADERS = {'Authorization': 'token {}'.format(TOKEN)}

with requests.Session() as s:

    s.headers.update(HEADERS)
    resp = s.get('http://example.com/')

4

অনুরোধগুলি স্থানীয়ভাবে কেবল ব্যবহারকারী-পাস প্যারামগুলির সাথে সমর্থন করে, টোকেনের সাহায্যে নয়।

আপনি, যদি আপনি চান, নীচের ক্লাসে টোকেন ভিত্তিক বেসিক প্রমাণীকরণের অনুরোধগুলি সমর্থন করতে যোগ করতে পারেন:

import requests
from base64 import b64encode

class BasicAuthToken(requests.auth.AuthBase):
    def __init__(self, token):
        self.token = token
    def __call__(self, r):
        authstr = 'Basic ' + b64encode(('token:' + self.token).encode('utf-8')).decode('utf-8')
        r.headers['Authorization'] = authstr
        return r

তারপরে, এটি ব্যবহার করতে নিম্নলিখিত অনুরোধটি চালান:

r = requests.get(url, auth=BasicAuthToken(api_token))

বিকল্প হিসাবে এর পরিবর্তে একটি কাস্টম শিরোনাম গঠন করা হবে, যেমনটি এখানে অন্যান্য ব্যবহারকারীদের দ্বারা পরামর্শ দেওয়া হয়েছিল।


3

আমি এখানে প্রতিষ্ঠিত করেছি, লিঙ্ককডিনের জন্য এটি আমার সাথে ঠিক আছে: https://auth0.com/docs/flows/guides/auth-code/call-api-auth-code তাই লিংকডিন লগইন সহ আমার কোড এখানে:

ref = 'https://api.linkedin.com/v2/me'
headers = {"content-type": "application/json; charset=UTF-8",'Authorization':'Bearer {}'.format(access_token)}
Linkedin_user_info = requests.get(ref1, headers=headers).json()


0

এটি আমার পক্ষে কাজ করেছে:

r = requests.get('http://127.0.0.1:8000/api/ray/musics/', headers={'Authorization': 'Token 22ec0cc4207ebead1f51dea06ff149342082b190'})

আমার কোড ব্যবহারকারীর দ্বারা উত্পাদিত টোকেন ব্যবহার করে।

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