Python ร้องขอไลบรารีถึงวิธีการส่งผ่าน Authorization header ด้วยโทเค็นเดียว


95

ฉันมี URI คำขอและโทเค็น ถ้าฉันใช้:

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'

ซึ่งเป็นตัวแทน base64 ของ 'TOK:<MY_TOKEN>'

ในการส่งส่วนหัวของคุณเองคุณต้องส่งในพจนานุกรมดังนี้:

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

Traceback (โทรล่าสุดล่าสุด): ไฟล์ "<stdin>" บรรทัด 1 ใน <module> File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py "บรรทัดที่ 55 ในการรับคำขอส่งคืน ('get', url, ** kwargs) File" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py "บรรทัดที่ 44 ในคำร้องขอ return session.request (method = method, url = url, ** kwargs) File" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages /requests/sessions.py "บรรทัด 323 ในคำขอ prep = self.prepare_request (req)

@rebHelium คุณสามารถสรุปสาระสำคัญที่? นั่นไม่ใช่การติดตามสแต็กทั้งหมดและไม่มีข้อบ่งชี้ถึงสิ่งที่คุณพยายามจริง
Ian Stapleton Cordasco

ขออภัย Stack Overflow ไม่อนุญาตให้โพสต์ผลลัพธ์ทั้งหมด ฉันทำตามที่คุณแนะนำ: r =

ไม่จำเป็นต้องขอโทษ ได้ผลหรือไม่ คุณยอมรับคำตอบของฉัน แต่ดูเหมือนว่าจะมีข้อยกเว้นสำหรับคุณ หากคุณสร้างส่วนสำคัญฉันสามารถช่วยคุณได้ง่ายกว่าการสนทนาที่นี่
Ian Stapleton Cordasco

Sigma ฉันพลาดรายละเอียดเล็กน้อยในโค้ดของคุณที่ทำให้เกิดข้อผิดพลาด รหัสจริงเป็นความลับดังนั้นฉันจึงไม่สามารถระบุส่วนสำคัญได้ แต่ฉันจะโพสต์คำถามเพิ่มเติมเนื่องจากฉันต้องการพัฒนาทักษะ Python ของฉันหากคุณต้องการดู เป็นคำถามง่ายๆที่ฉันแน่ใจว่าคุณน่าจะรู้

37

ผมกำลังมองหาบางสิ่งบางอย่างที่คล้ายกันและมาข้ามนี้ ดูเหมือนในตัวเลือกแรกที่คุณกล่าวถึง

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

"auth" รับสองพารามิเตอร์: ชื่อผู้ใช้และรหัสผ่านดังนั้นคำสั่งที่แท้จริงควรเป็น

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

ในกรณีของฉันไม่มีรหัสผ่านดังนั้นฉันจึงปล่อยพารามิเตอร์ที่สองในช่อง auth ว่างไว้ดังที่แสดงด้านล่าง:

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

หวังว่านี่จะช่วยใครสักคน :)


3
ถ้าคุณพยายามที่คุณจะได้รับr = requests.get('<MY_URI>',auth=('<MY_TOKEN>')) TypeError: 'str' object is not callableที่ทำให้ฉันนิ่งงันไปชั่วขณะจนกระทั่งฉันเจอสิ่งนี้: /
aydow

anserd ของคุณช่วยฉัน แต่หลังจากอ่านลิงค์ที่คุณให้มาเท่านั้น การทำงานกับการนำเข้า HTTPBasicAuth จาก request.auth ทำให้ง่ายมาก!
Wallem89


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 ดังนั้นรหัสของฉันด้วยการเข้าสู่ระบบ linkedin ที่นี่:

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.