在标题中使用基本授权 vs 在正文中使用用户名和密码
在标题中使用基本授权 vs 在正文中使用用户名和密码
我面临两种不同的情况。第一种方法是将用户名和密码作为模型发送到请求体中。第二种方法是在头部使用基本身份验证。这两种方法都能正常工作。
这两种方法只用于第一次调用进行身份验证,API会返回一个JWT令牌。
第一种方法:
curl -X 'POST' \ 'https://localhost:7122/api/Authentication/token' \ -H 'accept: text/plain' \ -H 'Content-Type: application/json' \ -d '{ "userName": "test", "password": "test" }'
第二种方法:
curl -L -X POST 'https://localhost:7122/api/Authentication/token' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Authorization: Basic ZzI0N2NmbnlwYzV3cmszaHAwZnU2cTk3N2YzZzYxY2hnODV1NzJzZmJkb3c3LmFwcHMudml2YXBheW1lbnRzLmNvbTowYk9xOHRkMzhMQVF4b3ptaWVqUDYwUzdzQnJkVkQ=' \ --data-urlencode 'grant_type=client_credentials'
对于JWT令牌,有什么规则应该遵循吗?使用什么是好的做法?
[图片](https://i.stack.imgur.com/LpjV2.png)
问题的原因:
问题是关于在登录请求中使用基本身份验证协议的授权头部还是在请求体中以明文方式发送用户名和密码的更好。使用授权头部的方式有两个缺点:授权头部有可能被记录下来,而请求体很少被记录;有时候基本身份验证头部无法通过。除了可能被记录的问题外,我不能想到还有其他固有的问题。
解决方法:
如果您从头开始设计并且可以访问系统的两端,并且它们将始终保持同步,那么无论您是使用授权头部还是请求体,在发送密码时都可以考虑发送一个经过哈希处理的密码。只要客户端和服务器在哈希方法和迭代次数上达成一致,即使数据可能泄漏或被记录在某处,这也会大大降低影响。这将需要一些自定义的安全工作。
问题的解决方法:
在登录请求中,使用授权头部的方式与在请求体中以明文方式发送用户名和密码的方式相比存在一些缺点。最好的做法是使用请求体的方式发送用户名和密码。同时,对于JWT令牌的使用,没有规则,只有惯例。最终,根据应用程序需要的信息来构建令牌,这些信息将以"claims"的形式存在。在登录请求中,返回一个JWT令牌即可。
解决方案的几点注意事项:
无论是使用授权头部还是请求体,都必须确保API只能通过HTTPS访问,否则无论在哪里放置密码,都会产生问题。
基于以上讨论,可以得出以下结论:在登录请求中,使用请求体的方式发送用户名和密码是最佳实践。同时,对于JWT令牌的使用,没有具体规则,只有惯例。最终,根据应用程序需要的信息来构建令牌。无论是使用授权头部还是请求体,都必须确保API只能通过HTTPS访问,以保证安全性。