用 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 使用Socket模块编写一个简单的服务器和客户端