OAuth – uwierzytelnianie w Django

W aplikacja webowych coraz popularniejsze staje się logowanie poprzez konta założone w Google czy na Facebook’u. W większości przypadków jest to realizowane poprzez OAuth, który jest otwartym standardem pozwalającym autoryzować dostęp do aplikacji. Sprawdź jak zbudować uwierzytelnianie w Django z wykorzystaniem OAuth

Biblioteki Google dla OAuth w Python

Celem zastosowania w swojej aplikacji uwierzytelniania kontem Google z wykorzystanie OAuth należy zainstalować poniższe biblioteki:

$ pip install --upgrade google-api-python-client oauth2client

Pierwsza z nich jest podstawową biblioteką konieczną do korzystania z API Google w Python’ie. Druga z kolei to biblioteka kliencka dla protokołu OAuth. Więcej informacji można znaleźć na stronie opisującej API dla klientów OAuth.

Poufne dane klienta

By móc korzystać z API Google po zainstalowaniu bibliotek, należy w Google Cloud Platform utworzyć dane do logowania tj. identyfikatory klienta OAuth. Po ich utworzeniu należy je pobrać w formacie JSON i zapisać w pliku o nazwie np. client_secret.json.

Ustawienia aplikacji w Django

Ścieżkę do pliku z poufnymi danymi klienta OAuth należy ustawić w pliku settings.py w projekcie w Django – będzie ona konieczna w późniejszym etapie przy budowie funkcji do uwierzytelniania:

GOOGLE_OAUTH2_CLIENT_SECRETS_JSON = 'client_secret.json'

Model danych uwierzytelniania w Django

Struktury danych wykorzystywane w Django zapisywane są jako modele. Również w przypadku uwierzytelniania w Django należy taki model przygotować. Przykładowa jest definicja może być jak niżej:

class CredentialsModel(models.Model):
  id = models.OneToOneField(User, primary_key=True)
  credential = CredentialsField()

URL do uwierzytelniania i funkcji zwrotnej dla OAuth

W pliku zawierającym definicje URL dla naszej aplikacji konieczne jest dodanie 2 URL do do uwierzytelniania i funkcji zwrotnej dla OAuth:

 url(r'^oauth2auth/', views_auth.auth),
 url(r'^oauth2callback/', views_auth.callback),

Kod funkcji do uwierzytelniania i funkcji zwrotnej dla OAuth

Na podstawie oficjalnej dokumentacji Google nt. uwierzytelniania w Python’ie zbudowany został poniższy kod do do uwierzytelniania i funkcji zwrotnej dla OAuth w pliku views_auth.py:

FLOW = flow_from_clientsecrets(
    settings.GOOGLE_OAUTH2_CLIENT_SECRETS_JSON,
    scope=settings.GOOGLE_OAUTH2_SCOPE,
    redirect_uri=settings.GOOGLE_OAUTH2_REDIRECT_URL)

Obiekt FLOW kreowany jest dla każdego użytkownika, który będzie się uwierzytelniać. Zmienna GOOGLE_OAUTH2_CLIENT_SECRETS_JSON definiuje ścieżkę do pliku z poufnymi danymi klienckimi OAuth, GOOGLE_OAUTH2_SCOPE określa zakres dostępu do danych Google, o które wnioskuje użytkownik (np. dostęp do odczytu do kalendarza), natomiast GOOGLE_OAUTH2_REDIRECT_URL określa URL funkcji zwrotnej, do której API Google’a wysyła żądanie po poprawnym uwierzytelnieniu w Google.

def auth(request):
    storage = DjangoORMStorage(CredentialsModel, 'id', request.user, 'credential')
    credential = storage.get()
    
    if credential is None or credential.invalid == True:
        FLOW.params['state'] = xsrfutil.generate_token(settings.SECRET_KEY,
                                                       request.user)
        authorize_url = FLOW.step1_get_authorize_url()
        return HttpResponseRedirect(authorize_url)

Przy uwierzytelnieniu wykorzystywany jest model CredentialsModel zbudowany wcześniej. W przypadku gdy w aplikacji nie ma żadnych danych poufnych tworzonych przy logowaniu (w kodzie określanych jako credential), następuje przekierowanie do Google’a.

def callback(request):
    if not xsrfutil.validate_token(settings.SECRET_KEY,
                                 request.POST.get('state', request.GET.get('state')).encode('UTF-8'),
                                 request.user):
        return  HttpResponseBadRequest()
    credential = FLOW.step2_exchange(request.GET)
    storage = DjangoORMStorage(CredentialsModel, 'id', request.user, 'credential')
    storage.put(credential)
    return HttpResponseRedirect("/")

Funkcja zwrotna sprawdza token, a następnie w przypadku jego poprawności zapisuje dane poufne i przekierowuje do głównego adresu aplikacji.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Time limit is exhausted. Please reload CAPTCHA.