Python solicita a biblioteca de como passar o cabeçalho de autorização com token único

98

Tenho um URI de solicitação e um token. Se eu usar:

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

etc., recebo 200 e vejo os dados JSON correspondentes. Então, eu instalei as requisições e quando tento acessar este recurso recebo um 403 provavelmente porque não conheço a sintaxe correta para passar esse token. Alguém pode me ajudar a descobrir? Isso é o que eu tenho:

import sys,socket
import requests

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

Ja tentei:

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

Mas nada disso funciona.


fonte

Respostas:

113

Em python:

('<MY_TOKEN>')

é equivalente a

'<MY_TOKEN>'

E as solicitações interpretam

('TOK', '<MY_TOKEN>')

Como você deseja solicitar o uso de autenticação básica e criar um cabeçalho de autorização como este:

'VE9LOjxNWV9UT0tFTj4K'

Qual é a representação de base64 de 'TOK:<MY_TOKEN>'

Para passar seu próprio cabeçalho, você passa em um dicionário como:

r = requests.get('<MY_URI>', headers={'Authorization': 'TOK:<MY_TOKEN>'})
Ian Stapleton Cordasco
fonte
Traceback (última chamada mais recente): Arquivo "<stdin>", linha 1, em <module> File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py ", linha 55, em get return request ('get', url, ** kwargs) File" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api .py ", linha 44, na solicitação de retorno session.request (method = method, url = url, ** kwargs) File" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages /requests/sessions.py ", linha 323, na solicitação prep = self.prepare_request (req)
@rebHelium você pode GIST que? Esse não é o rastreamento de pilha completo e não há nenhuma indicação do que você realmente tentou.
Ian Stapleton Cordasco
Desculpe, Stack Overflow não me permitiu postar toda a produção. Fiz exatamente o que você sugeriu: r = requests.get ('qualquer url que eu tenho', headers = {'Autorização': 'TOK: qualquer token que eu tenho'})
Não precisa se desculpar. Funcionou? Você aceitou minha resposta, mas parece ter causado uma exceção para você. Se você criar uma essência , posso ajudá-lo com mais facilidade do que ter uma conversa aqui.
Ian Stapleton Cordasco
Sigma, eu realmente perdi um pequeno detalhe em seu código que causou o erro. O código real é confidencial, então não posso entender. Mas vou postar perguntas adicionais, pois quero melhorar minhas habilidades em Python, se você quiser dar uma olhada. São perguntas muito simples, tenho certeza de que você sabe.
38

Eu estava procurando por algo semelhante e me deparei com isso . Parece que na primeira opção que você mencionou

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

"auth" leva dois parâmetros: nome de usuário e senha, então a declaração real deve ser

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

No meu caso, não havia senha, então deixei o segundo parâmetro no campo auth vazio, conforme mostrado abaixo:

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

Espero que isso ajude alguém :)

BajajG
fonte
3
se você tentar r = requests.get('<MY_URI>',auth=('<MY_TOKEN>')), você conseguirá TypeError: 'str' object is not callable. isso me deixou perplexo por um tempo até que me deparei com isso: /
aydow
Seu anserd me ajudou mas só depois de ler o link que você forneceu no qual você veio. Trabalhar com a importação HTTPBasicAuth de requests.auth torna isso muito fácil!
Wallem89
27

Isso funcionou para mim:

access_token = #yourAccessTokenHere#

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

Você também pode definir cabeçalhos para toda a sessão:

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

with requests.Session() as s:

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

As solicitações oferecem suporte nativo à autenticação básica apenas com parâmetros de passagem de usuário, não com tokens.

Você poderia, se quisesse, adicionar a seguinte classe para que as solicitações suportassem a autenticação básica baseada em tokens:

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

Então, para usá-lo, execute a seguinte solicitação:

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

Uma alternativa seria formular um cabeçalho personalizado, como foi sugerido por outros usuários aqui.

Amit Blum
fonte
4

Eu fundei aqui, está tudo bem comigo para o linkedin: https://auth0.com/docs/flows/guides/auth-code/call-api-auth-code, então meu código com o login do linkedin aqui:

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

Você pode tentar algo assim

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

Isso funcionou para mim:

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

Meu código usa token gerado pelo usuário.

Reymond Joseph
fonte