Dinlendirici bir API için kimlik Doğrulama belirteci: Bu belirteç düzenli olarak değiştirilmesi gerekir?
Ve Django django-rest-çerçeve ile Dinlendirici bir API inşa ediyorum: http://django-rest-framework.org/
Kimlik doğrulama mekanizması olarak seçtik "Belirteç kimlik Doğrulaması" ve ben zaten uygulanan aşağıdaki Django-Rest-Çerçeve belgelerine, soru, gereken uygulamayı yenilemek / değiştirmek Token periyodik ve evet ise nasıl? Token yenilenir gerektiren ya da web uygulama yapmak gerekir mobil uygulaması özerk olması gerekir?
En iyi uygulama nedir?
Burada kimseyi Django Rest Çerçeve tecrübesi ve teknik bir çözüm önerebilir misin?
(son bir soru daha düşük önceliğe sahiptir)
CEVAP
Mobil istemciler düzenli olarak kendi kimlik doğrulama belirteci yenilemek için iyi bir yöntemdir. Elbette bu sunucu kadar zorlamak için.
Varsayılan TokenAuthentication sınıfı bu desteklemiyor, ancak bu işlevselliği elde etmek için uzatabilirsiniz.
Örneğin:
class ExpiringTokenAuthentication(TokenAuthentication):
def authenticate_credentials(self, key):
try:
token = self.model.objects.get(key=key)
except self.model.DoesNotExist:
raise exceptions.AuthenticationFailed('Invalid token')
if not token.user.is_active:
raise exceptions.AuthenticationFailed('User inactive or deleted')
# This is required for the time comparison
utc_now = datetime.utcnow()
utc_now = utc_now.replace(tzinfo=pytz.utc)
if token.created < utc_now - timedelta(hours=24):
raise exceptions.AuthenticationFailed('Token has expired')
return token.user, token
Aynı zamanda sembolik bir giriş yapılır ne zaman yenilenir, böylece varsayılan geçersiz kılmak için çerçeve giriş görünümü dinlenme gereklidir:
class ObtainExpiringAuthToken(ObtainAuthToken):
def post(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
token, created = Token.objects.get_or_create(user=serializer.validated_data['user'])
if not created:
# update the created time of the token to keep it valid
token.created = datetime.datetime.utcnow()
token.save()
return Response({'token': token.key})
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
obtain_expiring_auth_token = ObtainExpiringAuthToken.as_view()
Ve URL değiştirmek için unutmayın
urlpatterns = patterns(
'',
url(r'^users/login/?$', '<path_to_file>.obtain_expiring_auth_token'),
)
Telefon numarası için kapsamlı bir düz...
Kimlik doğrulama aracı için bağlantı a...
Dinlendirici Kimlik Doğrulama...
Neden AuthorizeAttribute kimlik doğrul...
düzenli ifade doğrulama için bir kural...