Python fordert die Bibliothek auf, den Autorisierungsheader mit einem einzelnen Token zu übergeben

89

Ich habe eine Anforderungs-URI und ein Token. Wenn ich benutze:

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

usw. bekomme ich eine 200 und sehe mir die entsprechenden JSON-Daten an. Also habe ich Anforderungen installiert und wenn ich versuche, auf diese Ressource zuzugreifen, erhalte ich wahrscheinlich eine 403, weil ich nicht die richtige Syntax kenne, um dieses Token zu übergeben. Kann mir jemand helfen, es herauszufinden? Das habe ich:

import sys,socket
import requests

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

Ich habe es schon versucht:

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

Aber nichts davon funktioniert.


quelle

Antworten:

103

In Python:

('<MY_TOKEN>')

ist äquivalent zu

'<MY_TOKEN>'

Und fordert Dolmetscher an

('TOK', '<MY_TOKEN>')

Wenn Sie möchten, dass Anforderungen die Standardauthentifizierung verwenden und einen Autorisierungsheader wie folgt erstellen:

'VE9LOjxNWV9UT0tFTj4K'

Welches ist die base64-Darstellung von 'TOK:<MY_TOKEN>'

Um Ihren eigenen Header zu übergeben, übergeben Sie ein Wörterbuch wie folgt:

r = requests.get('<MY_URI>', headers={'Authorization': 'TOK:<MY_TOKEN>'})
Ian Stapleton Cordasco
quelle
Traceback (letzter Aufruf zuletzt): Datei "<stdin>", Zeile 1, in <module> File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py ", Zeile 55, in der Datei get return request ('get', url, ** kwargs)" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py ", Zeile 44, in Anfrage return session.request (method = method, url = url, ** kwargs) Datei" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages /requests/sessions.py ", Zeile 323, in Anfrage prep = self.prepare_request (req)
@rebHelium kannst du das sagen ? Das ist nicht die gesamte Stapelverfolgung, und es gibt keinen Hinweis darauf, was Sie tatsächlich versucht haben.
Ian Stapleton Cordasco
Leider konnte ich aufgrund des Stapelüberlaufs nicht die gesamte Ausgabe veröffentlichen. Ich habe genau das getan, was Sie vorgeschlagen haben: r = request.get ('Welche URL auch immer ich habe', Header = {'Autorisierung': 'TOK: Was auch immer für ein Token ich habe'})
Keine Notwendigkeit, sich zu entschuldigen. Hat es funktioniert? Sie haben meine Antwort akzeptiert, aber es scheint eine Ausnahme für Sie verursacht zu haben. Wenn Sie einen Kern erstellen, kann ich Ihnen leichter helfen, als hier ein Gespräch zu führen.
Ian Stapleton Cordasco
Sigma, ich habe tatsächlich ein kleines Detail in Ihrem Code übersehen, das den Fehler verursacht hat. Der eigentliche Code ist vertraulich, daher kann ich nichts sagen. Aber ich werde zusätzliche Fragen stellen, da ich meine Python-Fähigkeiten verbessern möchte, wenn Sie schauen möchten. Es sind sehr einfache Fragen, die Sie sicher kennen würden.
36

Ich suchte nach etwas Ähnlichem und stieß darauf . Es sieht aus wie in der ersten Option, die Sie erwähnt haben

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

"auth" akzeptiert zwei Parameter: Benutzername und Passwort, daher sollte die eigentliche Anweisung lauten

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

In meinem Fall gab es kein Passwort, daher habe ich den zweiten Parameter im Auth-Feld leer gelassen, wie unten gezeigt:

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

Hoffe das hilft jemandem :)

BajajG
quelle
3
Wenn Sie es versuchen r = requests.get('<MY_URI>',auth=('<MY_TOKEN>')), werden Sie bekommen TypeError: 'str' object is not callable. das hat mich eine Weile
verblüfft,
Ihr Anserd hat mir geholfen, aber erst nachdem Sie den von Ihnen angegebenen Link gelesen haben, den Sie erhalten haben. Die Arbeit mit dem HTTPBasicAuth-Import aus request.auth macht es sehr einfach!
Wallem89
26

Das hat bei mir funktioniert:

access_token = #yourAccessTokenHere#

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

Sie können auch Header für die gesamte Sitzung festlegen:

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

with requests.Session() as s:

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

Anforderungen unterstützen die grundlegende Authentifizierung nativ nur mit Benutzerpassparametern, nicht mit Token.

Wenn Sie möchten, können Sie die folgende Klasse hinzufügen, damit Anforderungen die tokenbasierte Basisauthentifizierung unterstützen:

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

Führen Sie dann die folgende Anforderung aus, um es zu verwenden:

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

Eine Alternative wäre, stattdessen einen benutzerdefinierten Header zu formulieren, wie dies von anderen Benutzern hier vorgeschlagen wurde.

Amit Blum
quelle
3

Ich habe hier gegründet, es ist ok für mich für Linkedin: https://auth0.com/docs/flows/guides/auth-code/call-api-auth-code, also mein Code mit mit Linkedin Login hier:

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
quelle
2

Sie können so etwas versuchen

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

Das hat bei mir funktioniert:

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

Mein Code verwendet ein vom Benutzer generiertes Token.

Reymond Joseph
quelle