Django Rest Framework authを使用したいのですが、1人のユーザーに複数のトークンが必要です。これを行うには、独自のトークンモデルを実装する必要があります。これは、トークン認証クラスで見つかりました。
class TokenAuthentication(BaseAuthentication):
"""
Simple token based authentication.
...
"""
model = Token
"""
A custom token model may be used, but must have the following properties.
* key -- The string identifying the token
* user -- The user to which the token belongs
"""
しかし、このモデルをどのように指定できるかわかりません。
TokenAuthentication
をサブクラス化する必要がありますか?
推奨答え
そのメッセージが言っているのは、モデル
Token
は、プロパティ
key
と
user
を持っている限り、他のモデルと交換できるということです。そうすれば、たとえば、トークンキーを生成するためのより複雑な方法が必要な場合は、独自のモデルを定義できます。
したがって、カスタムトークンモデルが必要な場合は、次のようにする必要があります。
rest_framework.authtoken.models
からトークンモデルをサブクラス化します。ここに必要なカスタム動作を追加しますが、key
プロパティとuser
プロパティがあることを確認してください。 rest_framework.authentication
からTokenAuthenticationクラスをサブクラス化します。そのmodel
プロパティを新しいトークンモデルに設定します。 必要なビューで、必ず新しい認証クラスを参照してください。
その他答え #1
settings.py
で独自の認証方法を定義します。
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'my_project.my_app.authentication.MyOwnTokenAuthentication',
),
}
authentication.py
で:
from rest_framework.authentication import TokenAuthentication
from my_project.my_app.models.token import MyOwnToken
class MyOwnTokenAuthentication(TokenAuthentication):
model = MyOwnToken
models.py
で:
import binascii
import os
from django.db import models
from django.utils.translation import ugettext_lazy as _
from my_project.companies.models import Company
class MyOwnToken(models.Model):
"""
The default authorization token model.
"""
key = models.CharField(_("Key"), max_length=40, primary_key=True)
company = models.OneToOneField(
Company, related_name='auth_token',
on_delete=models.CASCADE, verbose_name="Company"
)
created = models.DateTimeField(_("Created"), auto_now_add=True)
class Meta:
verbose_name = _("Token")
verbose_name_plural = _("Tokens")
def save(self, *args, **kwargs):
if not self.key:
self.key = self.generate_key()
return super(MyOwnToken, self).save(*args, **kwargs)
def generate_key(self):
return binascii.hexlify(os.urandom(20)).decode()
def __str__(self):
return self.key