2017-08-11 182 views
0

我试图从我的家庭笔记本电脑打电话给我的jwt验证django api居住在EC2实例。该API将返回给我一个身份验证密钥,但是当我尝试使用身份验证密钥时,它告诉我我没有授权。我提供了一个我尝试使用的各种方法来实现这个工作的例子。Python JWT授权令牌不授权与Django的jwt api

是否有任何具体的我在做这个代码错误,这将保证我的代码始终返回401错误?当要求使用JWT令牌进行身份验证的API时,是否有任何特定的我需要执行的操作或者具体的方法,我需要设置我的头文件以便我可以获取返回的值?或者这看起来像是后端的问题?

import requests 
from urllib2 import Request, urlopen 
import jwt 
from requests_jwt import JWTAuth, payload_method 
import json 


def tryme(chats, payload, jwt): 
    #method1 
    res = requests.post(chats, json=payload) 
    print res.status_code 
    # error 401 

    # method2 
    req = requests.get(chats, params=payload) 
    print req.status_code 
    # error 401 

    # method3 
    req = Request(chats) 
    req.add_header('Authorization', 'Token token={}'.format(auth['token'])) 
    req.add_header('content-type', 'application/json') 
    res = urlopen(req) 
    print res.status_code 
    # error 401 

    #method4 
    token = JWTAuth(jwt['token']) 
    out = requests.get(chats, auth=token) 
    print out.status_code 
    # error 401 

    out = requests.post(chats, auth=token) 
    print out.status_code 
    # error 401 


def main(): 
    payload = { 
     'username': 'testuser', 
     'password': 'test1234' 
    } 
    base_url = 'https://www.example.com/api/v1/' 
    api_auth = base_url + 'api-token-auth/' 
    chats = base_url + 'chats/' 
    auth = json.loads(requests.post(api_auth, json=payload).content) 
    # returns auth token 

    payload = {'Authorization': 'Token {}'.format(auth['token']), 'content-type': 'application/json'} 
    tryme(chats, payload, auth) 
    payload = {'Authorization': 'Bearer {}'.format(auth['token']), 'content-type': 'application/json'} 
    tryme(chats, payload, auth) 
    payload = {'Authorization': 'JWT {}'.format(auth['token']), 'content-type': 'application/json'} 
    tryme(chats, payload, auth) 

if __name__ == '__main__': 
    main() 
+1

缺省头方案是'授权:JWT '。在方法3中,您可以使用它。 –

+0

完美。我会看到关于提炼。如果它有效,我会让你知道,你可以为我创建一个答案 – castaway2000

回答

0

这已解决。但是我升级到python3。

import requests 
    import urllib3 
    urllib3.disable_warnings() 
    payload = { 
     'username': 'testuser', 
     'password': 'test1234' 
    } 
    base_url = 'https://www.example.com/api/v1/' 
    api_auth = base_url + 'api-token-auth/' 
    chats = base_url + 'chats/' 

    # get jwt token from login credentials 
    auth = json.loads(requests.post(api_auth, json=payload).content)['token'] 

    # correctly format the call which was my primary issue above. 
    payload = {'Authorization': 'JWT {}'.format(auth)} 

    # in python3 use urllib3. 
    http = urllib3.PoolManager() 
    res = http.request('GET', chats, headers=payload) 
    print(res.data) 

在python2:在Django JWT

import requests 
    payload = { 
     'username': 'testuser', 
     'password': 'test1234' 
    } 
    base_url = 'https://www.example.com/api/v1/' 
    api_auth = base_url + 'api-token-auth/' 
    chats = base_url + 'chats/' 

    # get jwt token from login credentials 
    auth = json.loads(requests.post(api_auth, json=payload).content)['token'] 

    # correctly format the call which was my primary issue above. 
    payload = {'Authorization': 'JWT {}'.format(auth)} 

    # make sure you are using the right request (GET vs POST) 
    out = requests.get(chats, headers=token) 
    print out.content