将 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 这样的前缀,所以你应该设置 Authorizationx-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 与您在带有前缀 Bearerapi/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;      
}

Nginx Reference