将 JWT 作为 "x-my-jwt" header 附加到上游 post 请求
Append JWT as the "x-my-jwt" header to the upstream post request
找到如下所示的特定解决方案
正如您从我的 中看到的那样,在 Django 中有一个特定的端点
#urls.py
path('api/token/', MyTokenObtainPairView.as_view(), name='token_obtain'),
#views.py
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
当我 POST 与现有用户
我收到回复,其中可能会看到类似于此的访问令牌
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTkwOTE0MTk4LCJqdGkiOiJhZDZmNzZhZjFmOGU0ZWJlOGI2Y2Y5YjQ4MGQzZjY2MiIsInVzZXJfaWQiOjExLCJpYXQiOjE1OTA5MTc0OTgsInVzZXIiOiJ0aWFnbyIsImRhdGUiOiIyMDIwLTA1LTMxIn0.-5U9P-WWmhlOenzCvc6b7_71Tz17LyNxe_DOMwwqH4RqrNsilVukEcZWFRGupLHRZjIvPya2QJGpiju9ujzQuw
如何将 JWT 作为 "x-my-jwt" header 附加到上游 POST 请求?
+---------+ +----------+ +--------+ +----------+
| | | | | | | |
| Browser |----->| Nginx |---------->|Gunicorn| ----->|Django App|
| | | | | | | |
+---------+ +----------+ +--------+ +----------+
浏览器在 /api/token
请求访问令牌
回应:
{
"access" : "TOKENXYZ",
"user" : "user",
"date" : "2020-06-08",
}
Django Rest framework authenticator 要求 Authorization
header 存在并且应该有一个像 Bearer
这样的前缀,所以你应该设置 Authorization
和 x-my-jwt
headers 在 API 通话中。
在浏览器中,如果您使用的是 jQuery 然后执行类似的操作。
$.ajax({
type: 'POST',
url: url,
headers: {
"x-my-jwt":"TOKEN_XYZ",
"Authorization" : "Bearer TOKEN_XYZ"
}
}).done(function(data) {
alert(data);
});
如果您要从 Django 应用程序 API 调用需要 JWT 令牌的其他 Django 应用程序服务器,则使用 requests
库将 headers 设置为
headers = {
"x-my-jwt":"TOKEN_XYZ",
"Authorization":"Bearer TOKEN_XYZ"
}
r = requests.post(url, data=payload, headers=headers)
如果需要,您也可以 header 在 Nginx 级别重写。在这种情况下,您需要设置 Authorization
header。 Authorization
header 与您在带有前缀 Bearer
的 api/token
调用中收到的访问令牌相同。如果您不想在 my-jwt
标记中使用 Bearer
,则删除 Bearer
组件,
proxy_set_header X-my-jwt $http_authorization;
根据这个定义:
如果是看一个请求,那么客户端是上游,服务端是下游;
相反,如果您正在查看响应,则客户端在下游,服务器在上游。
将令牌保存在 localStorage 中或作为 Redux 中的状态,我们可以将其与每个请求一起发送。取决于客户端框架如何处理请求
或者使用 Nginx
location some-location {
add_header X-my-jwt $http_authorization;
}
找到如下所示的特定解决方案
正如您从我的
#urls.py
path('api/token/', MyTokenObtainPairView.as_view(), name='token_obtain'),
#views.py
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
当我 POST 与现有用户
我收到回复,其中可能会看到类似于此的访问令牌
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTkwOTE0MTk4LCJqdGkiOiJhZDZmNzZhZjFmOGU0ZWJlOGI2Y2Y5YjQ4MGQzZjY2MiIsInVzZXJfaWQiOjExLCJpYXQiOjE1OTA5MTc0OTgsInVzZXIiOiJ0aWFnbyIsImRhdGUiOiIyMDIwLTA1LTMxIn0.-5U9P-WWmhlOenzCvc6b7_71Tz17LyNxe_DOMwwqH4RqrNsilVukEcZWFRGupLHRZjIvPya2QJGpiju9ujzQuw
如何将 JWT 作为 "x-my-jwt" header 附加到上游 POST 请求?
+---------+ +----------+ +--------+ +----------+
| | | | | | | |
| Browser |----->| Nginx |---------->|Gunicorn| ----->|Django App|
| | | | | | | |
+---------+ +----------+ +--------+ +----------+
浏览器在 /api/token
请求访问令牌
回应:
{
"access" : "TOKENXYZ",
"user" : "user",
"date" : "2020-06-08",
}
Django Rest framework authenticator 要求 Authorization
header 存在并且应该有一个像 Bearer
这样的前缀,所以你应该设置 Authorization
和 x-my-jwt
headers 在 API 通话中。
在浏览器中,如果您使用的是 jQuery 然后执行类似的操作。
$.ajax({
type: 'POST',
url: url,
headers: {
"x-my-jwt":"TOKEN_XYZ",
"Authorization" : "Bearer TOKEN_XYZ"
}
}).done(function(data) {
alert(data);
});
如果您要从 Django 应用程序 API 调用需要 JWT 令牌的其他 Django 应用程序服务器,则使用 requests
库将 headers 设置为
headers = {
"x-my-jwt":"TOKEN_XYZ",
"Authorization":"Bearer TOKEN_XYZ"
}
r = requests.post(url, data=payload, headers=headers)
如果需要,您也可以 header 在 Nginx 级别重写。在这种情况下,您需要设置 Authorization
header。 Authorization
header 与您在带有前缀 Bearer
的 api/token
调用中收到的访问令牌相同。如果您不想在 my-jwt
标记中使用 Bearer
,则删除 Bearer
组件,
proxy_set_header X-my-jwt $http_authorization;
根据这个定义:
如果是看一个请求,那么客户端是上游,服务端是下游; 相反,如果您正在查看响应,则客户端在下游,服务器在上游。
将令牌保存在 localStorage 中或作为 Redux 中的状态,我们可以将其与每个请求一起发送。取决于客户端框架如何处理请求 或者使用 Nginx
location some-location {
add_header X-my-jwt $http_authorization;
}