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.

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

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


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

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

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.


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

2

Anda bisa mencoba sesuatu seperti ini

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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.