Перейти к содержанию

Пример входа через Google (SPA)

Пример также можно увидеть здесь: https://example.cms.garpix.com/kontakty (см. консоль браузера)

Репозиторий здесь: https://github.com/garpixcms/example-corp-spa

Шаг 1. Создание нового проекта

Для начала, создайте новый проект по документации.

Шаг 2. Включаем вход

Необходимо включить вход в .env:

# ...
ENABLE_GARPIX_AUTH=True

Шаг 3. Настраиваем со стороны Google

3.1. Перейдите на страницу Google Console Credentials https://console.cloud.google.com/apis/credentials

3.2. Нажмите "Create Credentaials" и выберите "OAuth client ID"

3.3. В "Application type" выберите "Web application".

3.4. В появившейся форме заполните поля:

  • Name: любое название проекта
  • Authorized JavaScript origins: Добавить новый и ввести адрес сайта, например "https://mysite.com"
  • Нажмите "Create"

3.5. Скачайте файл (желательно) и сохраните ключи "Client ID" и "Client Secret". Они пригодятся на следующем шаге.

Шаг 4. Настраиваем со стороны бэкенда

Добавляем в backend/app/settings.py:

# ...

AUTHENTICATION_BACKENDS = [
    'social_core.backends.google.GoogleOAuth2',  # for client backend: google-oauth2
] + AUTHENTICATION_BACKENDS

# social - google
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = env('SOCIAL_AUTH_GOOGLE_OAUTH2_KEY')
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = env('SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET')

И в файл .env:

# Client ID от Google
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY=999999999999-A99AAAAAAAAAA652f6hlem2q5rfvnel4.apps.googleusercontent.com
# Client Secret от Google
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET=AAAAAA-Jt8qTX3Nw8_mXW2dxnpiDM-AAAA9A

Шаг 5. Настраиваем со стороны административной панели

Заходим в на страницу /admin/oauth2_provider/application/ (DJANGO OAUTH TOOLKIT -> Applications) и добавляем новый:

  • Client type: Confidential
  • Authorization grant type: Client credentials
  • Name: google-oauth2

Остальное оставляем как есть и сохраняем.

Также, строки "Client id" и "Client secret" необходимы на фронтенде.

Шаг 6. Настраиваем со стороны фронтенда (React)

6.1. Устанавливаем зависимости:

yarn add react-social-login

6.2. Добавляем компоненты:

Файл SocialButton.js:

import React from "react";
import SocialLogin from "react-social-login";

class SocialButton extends React.Component {
  render() {
    const { children, triggerLogin, ...props } = this.props;
    return (
      <button onClick={triggerLogin} {...props}>
        {children}
      </button>
    );
  }
}

export default SocialLogin(SocialButton);

Файл LoginWithGoogle.js:

import React from "react";
import SocialButton from "../SocialButton";

export default class LoginWithGoogle extends React.Component {

    handleSocialLogin = async (user) => {
        console.log(user);
        // convert token
        // POST /api/social-auth/convert-token/
        // Payload:
        /*
        {
            grant_type: 'convert_token',
            // Client id из п. 5
            client_id: '999999999999-A99AAAAAAAAAA652f6hlem2q5rfvnel4.apps.googleusercontent.com',
            // Client secret из п. 5
            client_secret: 'AAAAAA-Jt8qTX3Nw8_mXW2dxnpiDM-AAAA9A',
            backend: 'google-oauth2',
            token: user._token.accessToken,
        }
        */
        // В ответ вернется стандартный ответ как при получении токена.
    };

    handleSocialLoginFailure = (err) => {
        console.error(err);
    };

    render() {
        return (
            <div>
                <SocialButton
                    provider="google"
                    // Client ID от Google
                    appId="999999999999-A99AAAAAAAAAA652f6hlem2q5rfvnel4.apps.googleusercontent.com"
                    onLoginSuccess={
                        this.handleSocialLogin
                    }
                    onLoginFailure={
                        this.handleSocialLoginFailure
                    }
                >
                    Login with Google
                </SocialButton>
            </div>
        )
    }
}

Шаг 7. Тестируем

Вход работает только по https, обязательно потестируйте с нескольких аккаунтов.