用 Python 编写一个客户端来调用一个使用 JWT 身份验证的 REST Web 服务

Posted

技术标签:

【中文标题】用 Python 编写一个客户端来调用一个使用 JWT 身份验证的 REST Web 服务【英文标题】:write a client in Python to call a rest web service using JWT authentication 【发布时间】:2020-12-25 18:57:20 【问题描述】:

我已经按照in this article 解释的所有步骤设置了一个带有 JSON Web 令牌 (JWT) 身份验证的 Django REST 端点。

简而言之,暴露的端点是:

http://localhost:8000/api/token/ #获取新的jwt token http://localhost:8000/api/token/refresh/ # 刷新一个 jwt 令牌 http://localhost:8000/hello/ # 一个示例 Web 服务,需要 jwt 认证

文章中解释的示例使用 djangorestframework_simplejwt 包,它使用 settings.SECRET_KEY(Django Web 应用程序的)来加密 jwt 令牌(使用 HS256 算法)。

另外,在服务器端,我已经使用 Django 管理网站创建了一个特定的用户名(“testuser”),用于 JWT 授权。

现在,我该如何开始测试这个使用 JWT 身份验证的 REST Web 服务以及用 Python 编写的客户端?

【问题讨论】:

【参考方案1】:

开始测试示例 Web 服务:

首先,客户端需要获取一个新的令牌,因此我引入了 do_auth 函数,它返回一个包含 JWT 'access' 和 'refresh' 令牌的字典:

import json
import requests

AUTH_API_ENDPOINT = "http://localhost:8000/api/token/"
REFRESH_TOKEN_API_ENDPOINT = "http://localhost:8000/api/token/refresh/"


def do_auth(username, password, url=AUTH_API_ENDPOINT) -> dict:
    data = 
        "username": username,
        "password": password
    

    # sending post request and saving response as response object
    r = requests.post(url=url, data=data)

    # extracting response text
    response_text = r.text

    d = json.loads(response_text)

    return d

成功获得“访问”和“刷新”令牌后(我需要正确的凭据,即我需要在 Django 管理站点中定义一个用户),我可以使用“访问”令牌调用“你好” ' 终点:

def do_get(url, access_token: str):
    headers = 
        'Authorization': ('Bearer ' + access_token)
    

    response = requests.get(url, headers=headers)

    return response

因此,第一次调用 Web 服务:

token_dict = do_auth("testuser", ...testuser password... )
# check response status code (should be 200 if successful)

# now I can call the endpoint
response = do_get('http://localhost:8000/hello', token_dict['access'])
# check response status code (should be 200 if successful)

print(response)
print(response.status_code) # error 401 : not authenticated

这就是开始测试新 Web 服务的全部内容。

JWT 还提供令牌刷新,因此您还需要这样的东西:

def do_refresh(refresh_token, url=REFRESH_TOKEN_API_ENDPOINT):
    data = 
        'refresh': refresh_token
    

    r = requests.post(url=url, data=data)

    d = json.loads(r.text)

    return d

【讨论】:

以上是关于用 Python 编写一个客户端来调用一个使用 JWT 身份验证的 REST Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

来自 Python | 的远程过程调用红宝石 | ... 到 C++

用python+编写一个程序,打印出执行1+1运行100次的时间?

用python编写一个程序?

Python 使用Socket模块编写一个简单的服务器和客户端

编写一个程序 输入一系列单词 用逗号隔开,然后提取这些单词,并分行输出,删除空格

用python编写程序,输入一个正整数n,求0到这个数以内的所有基数和与偶数和