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.