2010-09-28 11 views
7

Rozważam dodanie kanałów RSS do jednej z moich aplikacji Django i chciałbym móc je uwierzytelnić.Django RSS Feed Authentication

Chcę użyć nowej struktury syndykowania w Django 1.2. Czytałem dokumenty o tym, jak to zrobić i mam podstawową konfigurację kanałów.

Jestem nowy w uwierzytelnianiu kanałów, więc nie jestem pewien, jakie jest najlepsze podejście do tego, jakie są moje opcje.

Każdy użytkownik ma unikatową pod-domenę i chciałbym, aby struktura adresu URL wyglądała mniej więcej tak: http://mysubdomain.mysite.com/myapp/rss/, jeśli to możliwe.

Nie chcę, aby kanały były publicznie dostępne, czy możliwe jest użycie nazwy użytkownika i hasła do uwierzytelnienia? Czy zauważyłeś, że większość czytników kanałów obsługuje to? Jeśli nie jest możliwe uwierzytelnienie dla każdego użytkownika, czy powinienem spróbować użyć adresu uuid, aby nadać mu unikalny URL lub czy nie jest to wystarczająco bezpieczne?

Jak zapewne wiesz, nie jestem pewien, w jakim kierunku podążać, więc wszelkie porady na temat najlepszego sposobu, aby to zrobić, byłyby bardzo mile widziane.

Dzięki

Odpowiedz

2

Czy próbowałeś owijania pogląd dystrybucyjny django.contrib.syndication.views.feed do widoku, który wymaga logowania? Kanały RSS powinny być zwykle pobierane przez HTTP, więc powinno to działać!

# Import Django's standard feed view. 
from django.contrib.auth.decorators import login_required 
from django.django.contrib.syndication.views import feed 

# Wrap it in a new feed view that requires authentication! 
private_feed = login_required(feed) 

Zastrzeżenie: Nigdy tego nie próbowałem!

Edytuj!

Aby być bezpieczne z czytników RSS, które nie obsługują przekierowywanie, powrót do stanu HTTP 401 kod z następujących czynności:

authentication_url = '/accounts/login' 
def feed_safe_login_required (view): 
    def _ (request, *args, **kwargs): 
     if not request.user.is_authenticated: 
      return HttpResponseNotAuthorized, authentication_url 
    return _ 

feed = feed_safe_login_required(django.contrib.syndication.views.feed) 

Gdzie HttpResponseNotAuthorized ma znaczenie zdefiniowane w niniejszym django snippet.

+0

nie sądzę, że będzie działać, ponieważ jeśli nie są podpisane, wymagane jest przekierowanie użytkownika i większość czytników kanałów RSS nie obsługuje przekierowania zalogować się. Od czytania do góry, myślę, że muszę użyć podstawowego uwierzytelnienia, a następnie zwrócić kod 401, jeśli nie są zalogowani. Nie wiem jeszcze, jak to zrobić, więc każda rada byłaby pomocna. – imns

+0

To samo dotyczy jednak Spills. Owiń, sprawdzając, czy użytkownik jest uwierzytelniony, a jeśli nie, zwróć niestandardowy obiekt HttpResponse, jak pokazano tutaj: http://djangosnippets.org/snippets/813/ –

2

To jest stary wątek, ale ostatnio spotkałem to samo pytanie. Rozwiązałem go przeciążenia metody obiektu Kanał __call__:

from django.http import HttpResponse 

class ArticleFeed(Feed): 
    "snip [standard definitions of title, link, methods...]" 

    def __call__(self,request,*args,**kwargs): 
     if not request.user.is_authenticated(): 
      return HttpResponse(status=401) 
     else: 
      return super().__call__(request,*args,**kwargs)