Python, kitaplığa, Yetkilendirme başlığının tek jetonla nasıl geçirileceğini ister


95

Bir istek URI'm ve jetonum var. Kullanırsam:

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

vb., bir 200 alıyorum ve ilgili JSON verilerini görüntülüyorum. Bu yüzden istekleri yükledim ve bu kaynağa erişmeye çalıştığımda muhtemelen 403 alıyorum çünkü bu belirteci iletmek için doğru sözdizimini bilmiyorum. Biri anlamama yardım edebilir mi? Sahip olduğum şey bu:

import sys,socket
import requests

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

Ben zaten denedim:

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

Ama bunların hiçbiri işe yaramıyor.

Yanıtlar:


112

Python'da:

('<MY_TOKEN>')

eşdeğerdir

'<MY_TOKEN>'

Ve yorumlar ister

('TOK', '<MY_TOKEN>')

İsteklerinizde Temel Kimlik Doğrulaması kullanmak ve aşağıdaki gibi bir yetkilendirme başlığı oluşturmak istediğinizde:

'VE9LOjxNWV9UT0tFTj4K'

Hangi base64 temsilidir 'TOK:<MY_TOKEN>'

Kendi başlığınızı geçmek için şöyle bir sözlüğe geçersiniz:

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

Traceback (en son çağrı): Dosya "<stdin>", satır 1, <module> Dosya "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py ", satır 55, iade isteğinde ('get', url, ** kwargs) Dosya" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py ", satır 44, istek dönüşü session.request (yöntem = yöntem, url = url, ** kwargs) Dosya" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages /requests/sessions.py ", satır 323, istek prep =

@rebHelium yapabilirsiniz Gist o? Bu yığın izinin tamamı değildir ve gerçekte ne denediğinize dair hiçbir gösterge yoktur.
Ian Stapleton Cordasco

Maalesef Stack Overflow çıktının tamamını göndermeme izin vermedi. Tam olarak önerdiğiniz gibi yaptım: r = request.get ('sahip olduğum url ne olursa olsun', başlıklar = {'Yetkilendirme': 'TOK: sahip olduğum simge ne olursa olsun'})

Özre gerek yok. İşe yaradı mı? Cevabımı kabul ettin ama bu senin için bir istisnaya neden oldu. Bir öz oluşturursanız , size burada sohbet etmekten daha kolay yardımcı olabilirim.
Ian Stapleton Cordasco

Sigma, aslında hataya neden olan kodunuzla ilgili küçük bir ayrıntıyı kaçırdım. Asıl kod gizlidir, bu yüzden cevabı veremem. Ama bakmak isterseniz Python becerilerimi geliştirmek istediğim için ek sorular göndereceğim. Çok basit sorular, eminim bileceksiniz.

37

Ben benzer bir şey arıyordum ve karşıdan karşıya geldi bu . Bahsettiğiniz ilk seçenekte benziyor

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

"auth" iki parametre alır: kullanıcı adı ve şifre, dolayısıyla gerçek ifade şu olmalıdır:

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

Benim durumumda şifre yoktu, bu yüzden kimlik doğrulama alanındaki ikinci parametreyi aşağıda gösterildiği gibi boş bıraktım:

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

Umarım bu birine yardımcı olur :)


3
Eğer denersen r = requests.get('<MY_URI>',auth=('<MY_TOKEN>')), alacaksın TypeError: 'str' object is not callable. bununla karşılaşana kadar bir süre beni
şaşırttı

Yanıtlayıcınız bana yardımcı oldu, ancak ancak sağladığınız ve aktardığınız bağlantıyı okuduktan sonra. Request.auth'dan HTTPBasicAuth içe aktarımıyla çalışmak bunu çok kolaylaştırır!
Wallem89

26

Bu benim için çalıştı:

access_token = #yourAccessTokenHere#

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

16

Ayrıca tüm oturum için başlıklar da ayarlayabilirsiniz:

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

with requests.Session() as s:

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

4

İstekler, belirteçlerle değil, yalnızca kullanıcı geçiş parametreleriyle temel kimlik doğrulamasını yerel olarak destekler.

İsterseniz, belirteç tabanlı temel kimlik doğrulamasını destekleyen isteklere sahip olmak için aşağıdaki sınıfı ekleyebilirsiniz:

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

Ardından, kullanmak için aşağıdaki isteği çalıştırın:

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

Bir alternatif, buradaki diğer kullanıcıların önerdiği gibi, bunun yerine özel bir başlık formüle etmektir.



2

Bunun gibi bir şey deneyebilirsin

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

0

Bu benim için çalıştı:

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

Kodum, kullanıcı tarafından oluşturulan jetonu kullanıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.