SORU
28 Ocak 2013, PAZARTESİ


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
13 Mart 2013, ÇARŞAMBA


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'),
)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Smith

    Bryan Smith

    12 Mart 2006
  • Dellbear816

    Dellbear816

    4 Mart 2008
  • skiesofblack.net

    skiesofblack

    14 HAZİRAN 2009