2013-09-28 228 views
31

Tôi có một URI yêu cầu và một mã thông báo. Nếu tôi sử dụng:Thư viện yêu cầu Python cách vượt qua tiêu đề Cấp phép bằng một mã thông báo

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

v.v., tôi nhận được 200 và xem dữ liệu JSON tương ứng. Vì vậy, tôi đã cài đặt các yêu cầu và khi tôi cố gắng truy cập vào tài nguyên này, tôi nhận được 403 có lẽ vì tôi không biết đúng cú pháp để chuyển mã thông báo đó. Bất cứ ai có thể giúp tôi tìm ra nó? Đây là những gì tôi có:

import sys,socket 
import requests 

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

Tôi đã cố gắng:

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

Nhưng không ai trong số những công việc.

Trả lời

39

Trong python:

('<MY_TOKEN>') 

tương đương với

'<MY_TOKEN>' 

Và yêu cầu giải thích

('TOK', '<MY_TOKEN>') 

Như bạn muốn yêu cầu sử dụng Basic Authentication và thủ một tiêu đề uỷ quyền như sau:

'VE9LOjxNWV9UT0tFTj4K' 

Đó là các đại diện của base64 'TOK:<MY_TOKEN>'

Để vượt qua tiêu đề riêng của bạn, bạn vượt qua trong một cuốn từ điển như vậy:

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

Traceback (cuộc gọi gần đây nhất): Tệp "", dòng 1, trong Tệp "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py ", dòng 55, trong yêu cầu trả lại ('get', url, ** kwargs) Tệp" /Library/Frameworks/Python.framework/Versions/2.7/lib/ python2.7/site-packages/requests/api.py ", dòng 44, theo yêu cầu return session.request (phương pháp = phương pháp, url = url, ** kwargs) Tệp" /Library/Frameworks/Python.framework/ Phiên bản/2.7/lib/python2.7/site-packages/request/sessions.py ", dòng 323, theo yêu cầu prep = self.prepare_request (req) –

+0

@rebHelium bạn có thể [gist] (https: // gist. github.com) Đó không phải là toàn bộ dấu vết ngăn xếp và không có dấu hiệu của những gì bạn thực sự cố gắng –

+0

Xin lỗi, Stack Overflow không cho phép tôi đăng toàn bộ đầu ra. Tôi đã thực hiện chính xác như bạn đã đề xuất: r = requests.get ('bất kỳ url nào tôi có', tiêu đề = {'Ủy quyền': 'TOK: mã thông báo nào tôi có'}) –

16

tôi đang tìm kiếm một cái gì đó tương tự và đã xem qua this. Dường như trong tùy chọn đầu tiên mà bạn đề cập

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

"auth" có hai tham số: tên người dùng và mật khẩu, vì vậy báo cáo kết quả thực tế nên

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

Trong trường hợp của tôi, không có mật khẩu, do tôi rời tham số thứ hai trong lĩnh vực auth trống như hình dưới đây:

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

Hope this helps ai đó :)

+0

nếu bạn thử 'r = requests.get ('', auth = (''))', bạn sẽ nhận được đối tượng 'TypeError: 'str' không thể gọi được '. làm tôi bối rối cho đến khi tôi bắt gặp điều này: / – aydow

0

Bạn có thể thử một cái gì đó như thế này

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

Bạn cũng có thể đặt tiêu đề cho toàn bộ phiên:

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

with requests.Session() as s: 

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

này đã làm việc cho tôi: access_token = # yourAccessTokenHere #

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