【问题标题】:Python JWT auth token does not authorize with django jwt apiPython JWT 身份验证令牌未使用 django jwt api 授权
【发布时间】:2018-01-20 09:58:56
【问题描述】:

我正在尝试从我的家用笔记本电脑调用位于 EC2 实例上的经过 jwt 身份验证的 django api。 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()

【问题讨论】:

  • Django JWT 中的默认标头方案是Authorization: JWT <token>。在方法 3 中,您可以使用它。
  • 完美。我会看看如何改进它。如果它有效,我会告诉你,你可以为我创建一个答案

标签: python django authentication jwt


【解决方案1】:

这已经解决了。但是我升级到了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中:

   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

【讨论】:

    猜你喜欢
    • 2018-07-01
    • 2017-12-10
    • 1970-01-01
    • 2021-07-17
    • 2017-07-21
    • 2021-03-25
    • 2020-08-23
    • 1970-01-01
    • 2019-02-27
    相关资源
    最近更新 更多