it-swarm.com.de

Python fordert die Bibliothek an, den Berechtigungsheader mit einem einzelnen Token zu übergeben

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

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

usw., ich bekomme eine 200 und sehe mir die entsprechenden JSON-Daten an ..__ Also installierte ich Anfragen und wenn ich versuche, auf diese Ressource zuzugreifen, bekomme ich wahrscheinlich eine 403, weil ich nicht die richtige Syntax für die Übergabe dieses Token kenne. Kann mir jemand helfen, das 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.

47
user1552586

In Python:

('<MY_TOKEN>')

ist äquivalent zu

'<MY_TOKEN>'

Und fordert Interpretationen an

('TOK', '<MY_TOKEN>')

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

'VE9LOjxNWV9UT0tFTj4K'

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

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

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

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

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

"auth" benötigt zwei Parameter: Benutzername und Kennwort. Die tatsächliche Anweisung sollte also sein

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

In meinem Fall gab es kein Passwort, also ließ ich den zweiten Parameter im Feld auth leer, wie unten gezeigt:

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

Hoffe das hilft jemandem :)

21
BajajG

Das hat für mich funktioniert:

access_token = #yourAccessTokenHere#

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

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/')
10
Anton Tarasenko

Sie können so etwas versuchen

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

Requests unterstützt die Basisauthentifizierung nativ nur mit User-Pass-Parametern, 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 anschließend 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.

0
Amit Blum