Django - autoryzacja przez Clickpass - tutorial

Clickpass umożliwia proste logowanie użytkowników za pomocą kont które już posiadają w innych systemach, np. hotmail, yahoo, google, facebook, aim, clickpass lub OpenID. Zasadę działania opisywałem w poprzednim poście. Teraz pokaże jak zaimplementować to w Django. Korzystam z aplikacji która ostatnio udostępniło washingtontimes, a mianowicie django-clickpass. Jest to aplikacja która bardzo upraszcza wykorzystanie clickpass w django.

Instalacja

Zainstaluj django-openid:

svn co http://django-openid.googlecode.com/svn/trunk/django_openid django_openid

Zainstaluj paczkę python OpenID 2.2.1 - http://openidenabled.com/files/python-openid/packages/python-openid-2.2.1.tar.gz. Szczegółowe instrukcje znajdziesz tutaj: http://www.openidenabled.com/python-openid/

Dodaj django_openid do Twoich INSTALLED_APPS.

Zainstaluj django-clickpass:

svn co http://opensource.washingtontimes.com/projects/public/django-clickpass/trunk/clickpass clickpass

Dodaj clickpass do Twoich INSTALLED_APPS.

Do głównych urls.py dodaj from clickpass.consumer import ClickPassConsumer

Dodaj (r'^openid/(.*)', ClickPassConsumer()), do Twoich urlpatterns w urls.py:

Przykład urls.py, do dodaniu ClickPassConsummer:

from clickpass.consumer import ClickPassConsumer
urlpatterns = patterns('',
    (r'^admin/(.*)', admin.site.root),
    (r'^moja_aplikacja/', include('moj_projekt.moja_aplikacja.urls')),
    (r'^openid/(.*)', ClickPassConsumer()),
)

Dodaj clickpass.consumer.ClickPassConsumer do MIDDLEWARE_CLASSES gdzieś po django.contrib.sessions.middleware.SessionMiddleware, np:

Przykład:

MIDDLEWARE_CLASSES = (
   'django.middleware.common.CommonMiddleware',
   'django.contrib.sessions.middleware.SessionMiddleware',
   'clickpass.consumer.ClickPassConsumer',
   'django_openid.consumer.SessionConsumer',
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.middleware.doc.XViewMiddleware',
    )

W szablonach możesz dodać przycisk clickpass za pomoca template tag'a clickpass_button_large* lub clickpass_button_small.

{% load clickpass %} 
{% if user.is_anonymous %} 
    Zaloguj się
    {% clickpass_button_small %} 
{% else %} 
    Zalogowano jako: {{user.first_name}} {{user.last_name}}
{% endif %}

Możesz także napisać kilka domyślnych szablonów które używa django-openid. Szablony są w katalogu: django_openid/templates/django_openid

Konfiguracja konta clickpass

Załóż tzw. site key, na: www.clickpass.com/developer.

  1. Krok 1 - Zarejestruj swoją domenę z nazwą oraz url'em.

  2. Krok 2 - ustaw następujące wartości:

    • OpenID trust root na http://www.twojadomena.com/
    • begin_openid_login na http://www.twojadomena.com/openid/
    • OpenID parameer label na openid_url
    • Submission method na POST
  3. Krok 3:

    • begin_add_openid_to_user ustaw na http://www.twojadomena.com/openid/add_openid_to_user/
    • user_id label ustaw na user_id
  4. Krok 4:

    • process_openid_registration_url na http://www.twojadomena.com/openid/register/
    • new_openid_completion_url zostaw puste
    • logo_url zostaw puste
    • Wymagane pola zostaw puste
  5. Dodaj następujące ustawienia do Twoich settings.py:

    • CLICKPASS_SITE_KEY = Twój site key
    • CLICKPASS_LOGO_URL = 'http://url do Twojego logo'

Uwagi

Uruchamiając django-clickpass na python'ie 2.4 miałem problem z python-openid. Jest tam bug związany z biblioteką hashlib. Aby rozwiązać problem należy nałożyć patcha dostępnego tutaj, lub uruchomić serwis na python'ie 2.5, gdzie owy błąd nie występuje.

Jeżeli chce się korzystać tylko z tej autoryzacji i używa się dekoratora login_required w widokach to należy pamiętać aby zmienić w settings.py LOGIN_URL na '/openid/'

Komentarze

7 April, 2009, 8:02 a.m.:

Minus (wielki, jak dla mnie) — clickpass nie ma strony przetłumaczonej na polski. Ale ogólnie, jak sprawdziłem przed momentem, działa. :)

Dominik Szopa
7 April, 2009, 9:21 a.m.:

Racja, jest to jakiś minus, być może za jakiś czas pojawią się jakieś lokalizacje, zobaczymy.

7 May, 2009, 6:48 p.m.:

Bardzo ciekawe rozwiązanie :)


Comments turned off