Javascript 如何将JWT设置为存储在本地存储中,以便我的域的所有部分都可以访问它?

Javascript 如何将JWT设置为存储在本地存储中,以便我的域的所有部分都可以访问它?,javascript,django,authentication,reactjs,django-rest-framework,Javascript,Django,Authentication,Reactjs,Django Rest Framework,我在后端使用django REST框架,在前端使用react。我已经设置了前端,以便在登录时,客户端在经过完全身份验证后接收JSON令牌。但是,我的后端(特别是API)没有接收这个JSON令牌 以下是我的url配置的外观: router = SimpleRouter() router.register(r'accounts', accountsviews.UserViewSet, 'list') router.register(r'groups', accountsviews.GroupView

我在后端使用django REST框架,在前端使用react。我已经设置了前端,以便在登录时,客户端在经过完全身份验证后接收JSON令牌。但是,我的后端(特别是API)没有接收这个JSON令牌

以下是我的url配置的外观:

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)
router=SimpleRouter()
注册(r'accounts',accountsviews.UserViewSet,'list')
router.register(r'groups',accountsviews.GroupViewSet)
URL模式=[
url(r“^admin/”,admin.site.url),
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/”,包括('rest\u framework.url',namespace='rest\u framework'),
url(r'^api令牌验证/',获取jwt令牌),
url(r“^api令牌刷新/”,刷新jwt令牌),
url(r'^api令牌验证/',验证jwt令牌),
url(r“^reset/done/$”,passwordview.reset\u done,name='password\u reset\u done'),
url(r'^reset/(?P[\w:-]+)/$),passwordview.reset,
name='password\u reset\u reset'),
url(r'^',包括(router.url)),
url(r'^',homeviews.home,name='home'),
]
urlpatterns=格式\后缀\模式(urlpatterns)

我觉得问题可能是因为我的api(股票api、账户api和组api)没有嵌套在r'^',homeviews.home中。如果是这样,我如何使JWT成为全局的,而不仅仅是特定于url?

您可能正在将JWT令牌保存在客户端的cookie中,为了使该cookie能够在您的域中访问,您需要将路径设置为“/”。 在JavaScript中,它是这样的
document.cookie=“jwt\u token=yourtokenhashhere;path=/;domain=yourdomain.com”
我不知道django是如何制作饼干的……但应该是类似的。搜索将令牌发送到客户端的代码部分,并确保为令牌cookie设置了路径。

您可能正在将JWT令牌保存在客户端的cookie中,为了使该cookie可以在您的域中访问,您需要将路径设置为“/”。 在JavaScript中,它是这样的
document.cookie=“jwt\u token=yourtokenhashhere;path=/;domain=yourdomain.com”
我不知道django是如何制作饼干的……但应该是类似的。搜索将令牌发送到客户端的代码部分,并确保设置了令牌cookie的路径。

由于客户端将JWT令牌存储在本地存储中,Django只能知道用户是否通过request.user.is_身份验证。您可以在中的每个请求的头中包含JWT,然后通过Django的meta字段访问它
request.META['JWT']
缺点是它需要出现在每个请求中

或者,您可以将jwt存储在cookie中。您必须修改身份验证代码,以便在用户成功身份验证并生成jwt令牌之后,在返回该jwt令牌之前,您希望将其存储在会话中<代码>请求。会话['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)

因为您的客户端将JWT令牌存储在本地存储中,Django只能知道用户是否通过request.user.is_身份验证。您可以在中的每个请求的头中包含JWT,然后通过Django的meta字段访问它
request.META['JWT']
缺点是它需要出现在每个请求中

或者,您可以将jwt存储在cookie中。您必须修改身份验证代码,以便在用户成功身份验证并生成jwt令牌之后,在返回该jwt令牌之前,您希望将其存储在会话中<代码>请求。会话['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)

这是我在客户机上保存JWT令牌的代码:localStorage.setItem('JWT',JWT),您需要将令牌与每个需要它的请求一起传递。因此,当您发出需要身份验证的新请求时,只需在头中添加本地令牌、POST或GET参数;然后在服务器上读取并验证它。如果令牌未存储在cookie中,它将不会被传递。我已将其设置为jwt现在存储为cookie。它现在在api页面中可见。问题是,若我要使用jwt为我的api设置身份验证,我会怎么做?我为DRF设置的默认身份验证类是“rest\u framework\u jwt.authentication.JSONWebTokenAuthentication”。我是否需要制作一个自定义的,对cookie进行解码,然后对JWT进行解码?这是我在客户机上保存JWT令牌的代码:localStorage.setItem('JWT',JWT),您需要将令牌与每个需要它的请求一起传递。因此,当您发出需要身份验证的新请求时,只需在头中添加本地令牌、POST或GET参数;然后在服务器上读取并验证它。如果令牌未存储在cookie中,它将不会被传递。我已将其设置为jwt现在存储为cookie。它现在在api页面中可见。问题是,若我要使用jwt为我的api设置身份验证,我会怎么做?我为DRF设置的默认身份验证类是“rest\u framework\u jwt.authentication.JSONWebTokenAuthentication”。我是否需要制作一个自定义的cookie,然后解码JWT?JWT是否必须存储为会话cookie?这是普通的饼干吗?如果是这样,在我将jwt设置为存储在常规cookie中之后,如何让我的api对这个jwt cookie进行身份验证?我的DRF身份验证类设置为“rest\u framework\u jwt.authentication.JSONWebTokenAuthentication”,jwt是否必须存储为会话cookie?这是普通的饼干吗?如果是这样,在我将jwt设置为存储在常规cookie中之后,如何让api对其进行身份验证