【发布时间】:2019-12-21 10:29:21
【问题描述】:
所以我不确定我的问题是否真的适合 stackoverflow,但我会试一试,看看我对 JWT 的了解是否真的正确,或者我是否完全脱离了循环。
所以我创建的是一个服务器 API,它读取从客户端应用发送的 POST 请求并返回承载令牌,这是访问我创建的其余 API 所必需的。
到目前为止,如果用户名和密码与登录名匹配,我有一个创建 Bearer 令牌的服务器 api。
一个简单的 POST 请求看起来像
{'username': 'hello', 'password': 'world'}
所以我所做的是创建了一个从 JWT.IO 站点编码的 JWT,其密码如下所示:
{'username': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImJhcnJ5In0.-TCwkrPr8dq4WqsckaWNG7G2ddn7e97hH0jkQ-1j5Bo',
'password': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6ImF1dG9zbmtyIn0.mWvxW4xga_OQMLKxf5zfSP4bSV0KzLPSRpqapU-RbAw'}
但是我的主要问题是我应该如何处理客户端应用程序之间的连接 -> 第一个 /token 请求才能获得不记名令牌?
似乎我确实需要以某种方式“硬编码”客户端应用程序中的用户名和密码才能访问我的 API,但我觉得这不是正确的方法,因为那样你就可以读取网络记录并向服务器发送相同的请求,您将永远获得一个新的 Bearer 令牌,您可以操纵我的服务器 api。
我的问题是我应该怎么做才能不能在客户端应用程序中公开我的用户名和密码并且能够通过我的服务器 api 进行操作?因为我的服务器所做的是它使用秘密解码来自 JWT 的用户名和密码,并且如果用户名和密码与我的服务器 api 用户名和密码匹配,则匹配。但是感觉就像通过已经完成编码的 JWT 令牌公开我的用户名和密码,您仍然可以使用这些值并做任何您想做的事情?
客户端应用示例:
import requests
headers = {
'accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
}
data = {'username': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImJhcnJ5In0.-TCwkrPr8dq4WqsckaWNG7G2ddn7e97hH0jkQ-1j5Bo',
'password': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6ImF1dG9zbmtyIn0.mWvxW4xga_OQMLKxf5zfSP4bSV0KzLPSRpqapU-RbAw'}
response = requests.post('http://127.0.0.1:8000/token', headers=headers, data=data, verify=False)
【问题讨论】:
-
我不明白为什么您在将凭据发送到服务器以获取不记名令牌时将用户名和密码放入令牌中。令牌的内容对于您获得令牌的每个人都是可读的,因此它增加了零安全性。您通常应该改用 https 连接。
-
@jps 我同意。因为我不确定我还能如何获得令牌。因为我确实需要发送有效的用户名和密码才能从服务器 api 获取 Bearer 令牌。所以这就是我卡住的地方。我不知道我应该做什么:(