1

去一个看起来像这样的特定解决方案

高级视图

从我之前的努力中可以看出,在 Django 中,有一个特定的端点

#urls.py
path('api/token/', MyTokenObtainPairView.as_view(), name='token_obtain'),

#views.py
class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

当我与现有用户一起发布时

给出的回应

我收到一个回复​​,可以看到与此类似的访问令牌

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTkwOTE0MTk4LCJqdGkiOiJhZDZmNzZhZjFmOGU0ZWJlOGI2Y2Y5YjQ4MGQzZjY2MiIsInVzZXJfaWQiOjExLCJpYXQiOjE1OTA5MTc0OTgsInVzZXIiOiJ0aWFnbyIsImRhdGUiOiIyMDIwLTA1LTMxIn0.-5U9P-WWmhlOenzCvc6b7_71Tz17LyNxe_DOMwwqH4RqrNsilVukEcZWFRGupLHRZjIvPya2QJGpiju9ujzQuw

如何将 JWT 作为“x-my-jwt”标头附加到上游 POST 请求?

4

2 回答 2

4
+---------+      +----------+           +--------+       +----------+
|         |      |          |           |        |       |          |
| Browser |----->|  Nginx   |---------->|Gunicorn| ----->|Django App|
|         |      |          |           |        |       |          |
+---------+      +----------+           +--------+       +----------+

响应时访问令牌的浏览器请求/api/token

{
     "access" : "TOKENXYZ",
     "user" : "user",
     "date" : "2020-06-08",
}

Django Rest 框架身份验证Authorization器需要存在标头,并且应该有一个前缀Bearer,因此您应该在 API 调用中设置Authorization和标头。x-my-jwt

从浏览器中,如果您使用的是 jQuery,请执行以下操作。

$.ajax({
    type: 'POST',
    url: url,
    headers: {
        "x-my-jwt":"TOKEN_XYZ",
        "Authorization" : "Bearer TOKEN_XYZ"
    }
}).done(function(data) { 
    alert(data);
});

如果您从 Django 应用程序向需要 JWT 令牌的其他 Django 应用程序服务器进行 API 调用,则使用requests库将标头设置为

headers = {
   "x-my-jwt":"TOKEN_XYZ",
   "Authorization":"Bearer TOKEN_XYZ"
}
r = requests.post(url, data=payload, headers=headers)

如果需要,您还可以在 Nginx 级别进行标头重写。在这种情况下,您需要设置Authorization标题。Authorization标头与您在通话中收到的访问令牌相同,api/token带有前缀Bearer。如果您不想 Bearermy-jwt令牌中删除该Bearer组件,

proxy_set_header X-my-jwt $http_authorization;
于 2020-06-08T08:31:18.213 回答
1

根据这个定义:

如果您正在查看请求,则客户端在上游,服务器在下游;相反,如果您正在查看响应,则客户端位于下游,而服务器位于上游。

将令牌放在 localStorage 中或作为 Redux 中的状态,我们可以将它与每个请求一起发送。取决于客户端框架如何处理请求或使用 Nginx

location some-location {
  add_header X-my-jwt $http_authorization;      
}

Nginx 参考

于 2020-06-08T11:29:22.343 回答