Adicionando autenticação por token no Django Rest Framework
Quando se trabalha numa aplicação onde o front-end(react, angular, etc) é separado do back-end(python, java, etc), o método de autenticação mais recomendado é o baseado em token onde, uma vez que o usuário forneça suas credenciais, o servidor gera um token que autentica o usuário que está fazendo as requisições.
Configuração do projeto
Neste projeto usaremos, além do Django rest framework, a biblioteca Django rest auth.
$ mkdir auth_demo && cd auth_demo$ python -m virtualenv venv$ source venv/bin/activate$ pip install django djangorestframework django-rest-auth[with_social]$ django-admin startproject auth_demo .
Obs: O with_social entre [ ] é para instalar o django rest auth com a funcionalidade de registro, ou seja, a funcionalidade de criar um usuário via api.
# settings.pyINSTALLED_APPS = [ ..... , 'rest_framework', 'rest_framework.authtoken', 'allauth', 'allauth.account', 'rest_auth', 'rest_auth.registration']SITE_ID = 1
Da pra ver que são várias bibliotecas logo de cara né? Isso porque o django rest auth (rest_auth) usa o django rest framework (rest_framework e rest_framework.authtoken) por baixo dos panos pra fazer o login e o logout. As outras bibliotecas (rest_auth.registration, allauth e allauth.account) são para fazer o registro. Este conjunto de bibliotecas disponibilizam três urls basicas para as operações que queremos.
# urls.pyurlpatterns = [ path('rest_auth/', include('rest_auth.urls')), path('rest_auth/registration/', include('rest_auth.registration.urls'))]
Isso gera três urls:
- [POST] /rest_auth/registration
- Body:
{
'username': 'username',
'email': 'email@email.com',
'password1': 'senha',
'password2': 'confirmarSenha',
}
- Retorno
{
"key": Token
}
2. [POST] /rest_auth/login
- Body
{
'username': 'username',
'password': 'senha',
}
- Retorno
{
"key": Token
}
- [POST] /rest_auth/logout
- Header:
Authorization: Token <Token>
- Retorno:
204 no content (logout com sucesso)
Uma vez com o token em mãos, mande ele através do header de toda requisição que fizer para esse backend nesse formato: Authorization: Token <seu-token>.
Referências: