我不确定我是否正确。请给我一个提示或指示。
我使用Django设置我的Web服务,并使用Django REST框架使用React Native制作移动应用程序。 Django使用基本会话身份验证,但Django REST API使用令牌身份验证来处理来自移动应用程序的请求。
我想在我现有的Django网站上实现小型ReactJS应用程序。在这个阶段,我认为我的小反应应用程序将需要auth令牌与REST api进行自身通信。
因此,我的想法是,当用户登录Web登录页面时,需要从API接收用户的API令牌并将其保存到cookie或localStorage中,同时在Django Web服务中处理正常的登录过程。因为我不想让用户再次登录以在我的网页上运行react app来获取身份验证令牌。
我是否正确?如果是这样,我怎么能让它有效?请参考Django登录view.py中的代码我是否需要一些代码才能获得API身份验证令牌并将其保存到客户端?
def Login(request):
if not request.user.is_authenticated:
if request.method == "POST":
email = request.POST['email']
password = request.POST['password']
user = authenticate(email = email, password = password)
if user is not None:
login(request, user)
messages.add_message(request, messages.SUCCESS, request.user.nickname + ' Welcome!')
return redirect('Search')
else:
messages.add_message(request, messages.WARNING, 'Please check Email / Password again')
return redirect('login')
else:
form = LoginForm()
return render(request, 'login.html', {'form': form })
else:
return redirect('main')
答案 0 :(得分:0)
您在登录功能中做了一些无用的事情。你可以使用jwt。它有一些很好的支持登录功能。在其登录功能中,当使用post发送用户名和密码时,它会将令牌返回给客户端。 http://getblimp.github.io/django-rest-framework-jwt/
你只需要设置urlpattern
from rest_framework_jwt.views import obtain_jwt_token
#...
urlpatterns = [
'',
# ...
url(r'^api-token-auth/', obtain_jwt_token),
]
返回令牌
$ curl -X POST -d "username=admin&password=password123" http://localhost:8000/api-token-auth/
在其他请求中,如果您需要身份验证,请使用以下请求
$ curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/
答案 1 :(得分:0)
他们都执行类似的任务,几乎没有差异。
令牌
DRF的内置令牌身份验证
DRF JWT令牌身份验证
数据库访问
DRF的内置令牌身份验证
DRF JWT令牌身份验证
赞成
DRF的内置令牌身份验证
DRF JWT令牌身份验证
缺点
DRF的内置令牌身份验证
DRF JWT令牌身份验证
参考:Django : DRF Token based Authentication VS JSON Web Token
答案 2 :(得分:0)
在我通过长期的研究和学习解决后,我想留下我的答案。我的解决方案非常简单。设置DRF会话认证启用。在setting.py中添加一些代码
REST_FRAMEWORK = {
# ...
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}
2。添加&#39;凭据:&#34;包括&#34;&#39;获取代码以使用已登录的会话cookie进行身份验证。
await fetch(API_URL, {
credentials: "include"
})
这个解决方案解决了我的问题。