Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Non-user base TokenAuthentication for django-rest-framework

I'm trying to create an api with token authentiaction. My problem is that I don't want tokens to be associated with user accounts but rather an account model.

For example:

class Account(models.Model):
    slug =      models.SlugField()
    name =      models.CharField(max_length=255)
    website =   models.URLField(blank=True, default='')
    members =   models.ManyToManyField(User, through='AccountMember')

class AccountMember(models.Model):
    ADMIN       = 1
    MANAGER     = 2
    MEMBER      = 3
    ROLES = (
        (ADMIN,     'administrator'),
        (MANAGER,   'manager'),
        (MEMBER,    'member'),
    )
    user =          models.ForeignKey(User)
    account =       models.ForeignKey(Account)
    role =          models.PositiveSmallIntegerField(choices=ROLES)
    date_joined =   models.DateField(auto_now_add=True)

class Token(models.Model):
    """
    The default authorization token model.
    """
    key = models.CharField(max_length=40, primary_key=True)
    account = models.ForeignKey(Account, related_name='auth_tokens')
    only_allowed_ips = models.BooleanField(default=False)
    ip_list = models.TextField(default='', blank=True)
    created = models.DateTimeField(auto_now_add=True)

As you can see, there are multiple users associated with an account so assigning the token to them would be useless.

I also want to be able to add multiple tokens to an account.

Does anyone know the best way I could add authentication/permissions to a system like this?

like image 322
Ross Lote Avatar asked Mar 23 '14 01:03

Ross Lote


People also ask

Which authentication is best in Django REST framework?

JSON Web Token (JWT) Authentication This is a new and popular standard that works similar to TokenAuthentication except that it does not need to save tokens in the database.

Can I use Django REST framework without Django?

REST framework requires the following: Python (3.6, 3.7, 3.8, 3.9, 3.10) Django (2.2, 3.0, 3.1, 3.2, 4.0, 4.1)

How do I get authentication token in Django REST framework?

This authentication scheme uses a simple token-based HTTP Authentication scheme. Token authentication is appropriate for client-server setups, such as native desktop and mobile clients. Make sure to run manage.py migrate after changing your settings. The rest_framework.authtoken app provides Django database migrations.

How can you secure the Django REST framework based REST API?

User token endpoint The Django rest framework comes with an endpoint that users can use to generate their authentication tokens by providing their valid username and password. In the django_todo project directory add the API endpoint for token generation in the urls.py file.


1 Answers

You must replicate the following classes:

django.contrib.auth.backends.ModelBackend: to check for auth and permissions django.contrib.auth.middleware.AuthenticationMiddleware: to set your Account linked with the request

probably you must create another django.contrib.auth.models.Permission to store your Account related permissions

like image 105
sax Avatar answered Sep 22 '22 06:09

sax