Python meminta pustaka cara meneruskan header Otorisasi dengan token tunggal

95

Saya memiliki URI permintaan dan token. Jika saya menggunakan:

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

dll., Saya mendapatkan 200 dan melihat data JSON yang sesuai. Jadi, saya menginstal permintaan dan ketika saya mencoba mengakses sumber ini saya mendapatkan 403 mungkin karena saya tidak tahu sintaks yang benar untuk meneruskan token itu. Adakah yang bisa membantu saya mengetahuinya? Inilah yang saya miliki:

import sys,socket
import requests

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

Saya sudah mencoba:

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>'))

Tapi tidak satupun dari ini berhasil.


sumber

Jawaban:

112

Dengan python:

('<MY_TOKEN>')

setara dengan

'<MY_TOKEN>'

Dan permintaan menafsirkan

('TOK', '<MY_TOKEN>')

Saat Anda menginginkan permintaan untuk menggunakan Autentikasi Dasar dan membuat header otorisasi seperti ini:

'VE9LOjxNWV9UT0tFTj4K'

Yang merupakan representasi base64 dari 'TOK:<MY_TOKEN>'

Untuk meneruskan tajuk Anda sendiri, Anda memasukkan kamus seperti ini:

r = requests.get('<MY_URI>', headers={'Authorization': 'TOK:<MY_TOKEN>'})
Ian Stapleton Cordasco
sumber
Traceback (panggilan terakhir terakhir): File "<stdin>", baris 1, di <module> File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py ", baris 55, di dapatkan permintaan pengembalian ('get', url, ** kwargs) File" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py ", baris 44, dalam request return session.request (method = method, url = url, ** kwargs) File" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages /requests/sessions.py ", baris 323, dalam permintaan prep = self.prepare_request (req)
@rebHelium dapatkah Anda intinya ? Itu bukan seluruh pelacakan tumpukan dan tidak ada indikasi apa yang sebenarnya Anda coba.
Ian Stapleton Cordasco
Maaf, Stack Overflow tidak mengizinkan saya memposting keseluruhan keluaran. Saya melakukan persis seperti yang Anda sarankan: r = requests.get ('url apa pun yang saya miliki', headers = {'Authorization': 'TOK: token apa pun yang saya miliki'})
Tidak perlu meminta maaf. Apa itu bekerja? Anda menerima jawaban saya tetapi tampaknya telah menyebabkan pengecualian untuk Anda. Jika Anda membuat intinya, saya dapat membantu Anda dengan lebih mudah daripada melakukan percakapan di sini.
Ian Stapleton Cordasco
Sigma, saya sebenarnya melewatkan satu detail kecil pada kode Anda yang menyebabkan kesalahan. Kode sebenarnya bersifat rahasia jadi saya tidak bisa intinya. Tetapi saya akan memposting pertanyaan tambahan karena saya ingin meningkatkan keterampilan Python saya, jika Anda ingin melihatnya. Itu adalah pertanyaan yang sangat sederhana, saya yakin Anda pasti tahu.
37

Saya sedang mencari sesuatu yang serupa dan menemukan ini . Sepertinya di opsi pertama yang Anda sebutkan

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

"auth" membutuhkan dua parameter: nama pengguna dan kata sandi, jadi pernyataan sebenarnya haruslah

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

Dalam kasus saya, tidak ada kata sandi, jadi saya membiarkan parameter kedua di bidang auth kosong seperti yang ditunjukkan di bawah ini:

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

Semoga ini bisa membantu seseorang :)

BajajG
sumber
3
jika Anda mencoba r = requests.get('<MY_URI>',auth=('<MY_TOKEN>')), Anda akan mendapatkan TypeError: 'str' object is not callable. yang membuat saya bingung untuk sementara waktu sampai saya menemukan ini: /
aydow
Anserd Anda membantu saya tetapi hanya setelah membaca di tautan yang Anda berikan yang Anda terima. Bekerja dengan impor HTTPBasicAuth dari requests.auth membuatnya sangat mudah!
Wallem89
26

Ini berhasil untuk saya:

access_token = #yourAccessTokenHere#

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

Anda juga dapat menyetel header untuk seluruh sesi:

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

with requests.Session() as s:

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

Permintaan secara native mendukung autentikasi dasar hanya dengan parameter user-pass, bukan dengan token.

Anda dapat, jika ingin, menambahkan kelas berikut untuk meminta dukungan otentikasi dasar berbasis token:

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

Kemudian, untuk menggunakannya jalankan permintaan berikut:

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

Alternatifnya adalah dengan merumuskan tajuk khusus, seperti yang disarankan oleh pengguna lain di sini.

Amit Blum
sumber
3

saya didirikan di sini, tidak apa-apa dengan saya untuk linkedin: https://auth0.com/docs/flows/guides/auth-code/call-api-auth-code jadi kode saya dengan login linkedin di sini:

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()
Tri Tran
sumber
2

Anda bisa mencoba sesuatu seperti ini

r = requests.get(ENDPOINT, params=params, headers={'Authorization': 'Basic %s' %  API_KEY})
swatisinghi
sumber
1

Ini berhasil untuk saya:

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

Kode saya menggunakan token yang dibuat pengguna.

Reymond Joseph
sumber