我在我的后端使用django休息框架并为我的前端做出反应。我已经设置了前端,因此登录客户端在完全验证后会收到JSON令牌。但是,我的后端 - 特别是API没有收到此JSON令牌。
以下是我的网址:
router = SimpleRouter()
router.register(r'accounts', accountsviews.UserViewSet, 'list')
router.register(r'groups', accountsviews.GroupViewSet)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^message/', homeviews.message, name="message"),
url(r'^stocks_api/', stocksviews.StockList.as_view()),
url(r'^passwordreset/', homeviews.passwordreset.as_view(), name='passwordreset'),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^api-token-auth/', obtain_jwt_token),
url(r'^api-token-refresh/', refresh_jwt_token),
url(r'^api-token-verify/', verify_jwt_token),
url(r'^reset/done/$', passwordviews.reset_done, name='password_reset_done'),
url(r'^reset/(?P<token>[\w:-]+)/$', passwordviews.reset,
name='password_reset_reset'),
url(r'^', include(router.urls)),
url(r'^', homeviews.home, name='home'),
]
urlpatterns = format_suffix_patterns(urlpatterns)
我觉得问题可能是因为我的apis(stocks_api,accounts_api和groups_api)没有嵌套在r&#39; ^&#39;,homeviews.home中。如果是这样,我将如何使JWT全球化,而不仅仅是针对网址?
答案 0 :(得分:0)
您可能正在将JWT令牌保存在客户端的cookie中。要使该cookie可在您的域中访问,您需要将路径设置为&#34; /&#34;。
在JavaScript中,它就是这样的document.cookie = "jwt_token=yourtokenhashhere;path=/;domain=yourdomain.com";
。
我不知道django如何设置cookie ...但它应该是类似的东西。搜索将令牌发送到客户端的代码部分,并确保为令牌cookie设置/的路径。
答案 1 :(得分:0)
因为您的客户端将JWT令牌存储在本地存储中,所以Django只能通过request.user.is_authenicated知道用户是否为authenticated。您可以在front end中每个请求的标头中包含您的JWT,然后通过Django的元字段访问它。 request.META['JWT']
缺点是它需要在每个请求中。
或者,您可以将jwt存储在cookie中。您必须修改您的身份验证代码,以便在用户成功通过身份验证并生成jwt令牌之后,在返回该jwt令牌之前,您希望将其存储在会话中。 request.session['jwt_token']
然后可以在整个应用中的任何视图中访问令牌。
验证,查看伪代码
def obtain_jwt_token(self, request):
jwt_token = jwt_authenticate(request.user, request.DATA['password'])
request.session['JWT'] = jwt_token
return (jwt_token)