Adicionando autenticação por token no Django Rest Framework

Renato Lelis
2 min readApr 7, 2020

--

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:

  1. [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:

--

--