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.

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

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


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

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

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.


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

2

Sie können so etwas versuchen

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.