2017-08-11 31 views
0

私の自宅のラップトップからEC2インスタンスに存在する私のjwt認証されたdjango APIを呼び出そうとしています。 APIは私に認証キーを返しますが、認証キーを使用しようとすると、認証されていないIMに通知されます。私はこれを動作させるために使用しようとしている様々なメソッドの例を提供しました。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

デフォルトヘッダスキームは '認可あります。方法3では、それを使用することができます。 –

+0

完璧。私はそれを洗練することを見ます。それがうまくいくなら、私はあなたに知らせてくれます。あなたは私のための答えを作り出すことができます – castaway2000

答えて

0

これを解決しました。しかし、私はpython3にアップグレードしました。 python2で

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) 

:JWT ':ジャンゴ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