Файл: README - Документація для zquestz / omniauth-google-oauth2 (майстер)

  1. Установка
  2. Налаштування API Google
  3. Використання
  4. Конфігурація
  5. Auth Hash
  6. Devise
  7. Одноразовий потік коду (гібридна аутентифікація)
  8. Стан Omniauth
  9. Фіксація невідповідності протоколу для redirect_uri в Rails
  10. Ліцензія

Стратегія автентифікації з Google через OAuth2 в OmniAuth.

Отримайте ключ API за адресою: https://code.google.com/apis/console/ Зверніть увагу на ідентифікатор клієнта та секрет клієнта.

Примітка . Потрібно ввімкнути "API контактів" і "API Google+" за допомогою консолі Google API. В іншому випадку ви отримаєте помилку OAuth2 :: Повідомлення про те, що під час спроби аутентифікації доступ не налаштований.

Докладніше див. У документах Google: https://developers.google.com/accounts/docs/OAuth2

Установка

Додати до вашого файлу Gemfile:

gem "omniauth-google-oauth2"

Потім встановіть пакет.

Налаштування API Google

  • Йти до ' https://console.developers.google.com '
  • Виберіть свій проект.
  • Натисніть "Увімкнути та керувати API".
  • Переконайтеся, що функція "Контакти API" і "Google+ API" увімкнено.
  • Перейдіть до Повноваження, потім виберіть вкладку "Екран згоди OAuth" і надайте "EMAIL ADDRESS" і "PRODUCT NAME"
  • Зачекайте 10 хвилин, щоб зміни вступили в силу.

Використання

Ось приклад додавання проміжного програмного забезпечення до програми Rails у конфігурації / ініціалізації / omniauth.rb:

Рейки. . config. middleware. використання OmniAuth :: Постачальник конструкторів: google_oauth2, ENV ["GOOGLE_CLIENT_ID"], ENV ["GOOGLE_CLIENT_SECRET"]

Тепер ви можете отримати доступ до URL-адреси OmniAuth Google OAuth2: / auth / google_oauth2

Додаткові приклади див. У прикладах / omni_auth.rb

ПРИМІТКА. Під час розробки програми, якщо змінити область дії в ініціалізаторі, потрібно перезапустити сервер додатків. Пам'ятайте, що "електронна пошта" та "профіль" потрібні!

Конфігурація

Можна налаштувати кілька параметрів, які ви передаєте до методу постачальника за допомогою хешу:

  • scope: список розділених комами дозволів, які потрібно запросити від користувача. Див Ігровий майданчик Google OAuth 2.0 повний список доступних дозволів. Застереження:
    • Області електронної пошти та профілю використовуються за замовчуванням. Визначивши власну область дії, ви перекриваєте ці типові значення. Якщо вам потрібні ці області, не забудьте додати їх самі!
    • Області, які починаються з https://www.googleapis.com/auth/, не потребують вказаного префікса. Хоча ви можете використовувати книги меншого розміру, оскільки цей дозвіл починається з вказаного префікса, вам слід, наприклад, скористатися повним URL-адресою області дії https://docs.google.com/feeds/ для доступу до документів користувача.
  • prompt: Розмежований пробілом список значень рядків, який визначає, чи буде повторно запрошено користувача для автентифікації та / або згоди. Можливі значення:
    • none: не відображатимуться сторінки автентифікації або згоди; вона поверне помилку, якщо користувач ще не пройшов перевірку автентичності, і не має попередньо налаштовану згоду на запитані області. Це може використовуватися як метод перевірки існуючої аутентифікації та / або згоди.
    • згода: Користувачеві завжди буде запропоновано отримати згоду, навіть якщо він раніше дозволив доступ до даного набору областей.
    • select_account: користувачеві завжди буде запропоновано вибрати обліковий запис користувача. Це дозволяє користувачеві, який має кілька сеансів поточного облікового запису, вибрати одну з них.

Якщо значення не вказано, користувач бачить тільки сторінку автентифікації, якщо він не ввійшов і бачить лише сторінку згоди вперше, коли він авторизує заданий набір областей.

  • image_aspect_ratio: форма зображення профілю користувача. Можливі значення:
    • original: Зображення підтримує початкове співвідношення сторін.
    • Квадрат: малюнок має однакову ширину і висоту.

Стандартні для оригіналу.

  • image_size: Розмір зображення профілю користувача. Повернене зображення матиме ширину, рівну заданому значенню і висоті змінної, відповідно до обраного image_aspect_ratio. Крім того, можна запитати зображення з певною шириною і висотою, встановивши цей параметр на хеш з шириною і висотою як клавіші. Якщо вказано лише ширину або висоту, повертається зображення, ширина або висота якого ближче до запитаного розміру та запитаного співвідношення сторін. За замовчуванням задається початкова ширина і висота зображення.

  • name: назва стратегії. Типовим ім'ям є google_oauth2, але його можна змінити на будь-яке значення, наприклад, Google. URL-адреса OmniAuth, таким чином, зміниться на / auth / google, а ключ постачальника в хеш-авторі повернеться в Google.

  • access_type: За промовчанням в автономному режимі, тому маркер оновлення надсилається для використання, коли користувач не присутній у веб-переглядачі. Можна встановити онлайн. Більше про автономний доступ

  • hd: (Необов’язково) Обмежити вхід до певного домену, який розміщено в Google Apps. Це може бути просто рядок 'domain.com' або масив% w (domain.com domain.co). Докладніша інформація на сайті: https://developers.google.com/accounts/docs/OpenIDConnect#hd-param

  • skip_jwt: Пропустити обробку JWT. Це стосується користувачів, які бачать помилки декодування JWT у полі iat.

  • login_hint: Коли ваша програма знає, який користувач, який він намагається перевірити, він може надати цей параметр підказці серверу аутентифікації. Передавши цю підказку, пригнічує вибір облікового запису та попередньо заповнити поле електронної пошти у формі входу або виберіть відповідний сеанс (якщо користувач використовує декілька входів), що допоможе уникнути проблем, які виникають, якщо ваша програма реєструє неправильний обліковий запис користувача. Значення може бути адресою електронної пошти або підрядковим рядком, що еквівалентно ідентифікатору користувача Google+.

  • include_granted_scopes: Якщо це надано значенням true, і запит на авторизацію надано, авторизація буде включати будь-які попередні права, надані цій комбінації користувача або програми для інших областей застосування. Перегляньте Google Інкрементальна авторизація додаткові деталі.

  • openid_realm: Встановіть значення області OpenID, щоб дозволити оновлення з аутентифікації на основі OpenID до аутентифікації на основі OAuth 2. Коли це правильно встановлено, значення openid_id буде встановлено в [: extra] [: id_info] в хеші автентифікації з значенням URL-адреси користувача OpenID користувача.

Ось приклад можливої ​​конфігурації, де змінюється назва стратегії, користувачеві пропонують додаткові дозволи, користувачеві завжди пропонується вибрати свій обліковий запис при вході в систему, а зображення профілю користувача повертається як мініатюра:

Рейки. . config. middleware. використання OmniAuth :: Постачальник послуг: google_oauth2, ENV ["GOOGLE_CLIENT_ID"], ENV ["GOOGLE_CLIENT_SECRET"], {: name => "google",: scope => "електронна пошта, профіль, plus.me, http: // gdata. youtube.com ",: prompt =>" select_account ",: image_aspect_ratio =>" квадрат ",: image_size => 50} кінець

Auth Hash

Ось приклад хешу аутентифікації, доступної в зворотному виклику, доступ до request.env ["omniauth.auth"]:

{: provider => "google_oauth2",: uid => "123456789",: info => {: ім'я => "John Doe",: email => "[email protected]_name.com",: first_name => "Джон" ,: last_name => "Doe",: image => "https://lh3.googleusercontent.com/url/photo.jpg"},: credentials => {: token => "token",: refresh_token => " another_token ",: expires_at => 1354920555,: expires => true},: extra => {: raw_info => {: sub =>" 123456789 ",: email =>" [email protected] ",: email_verified => true,: name => "John Doe",: given_name => "John",: family_name => "Doe",: profile => "https://plus.google.com/123456789",: picture = > "https://lh3.googleusercontent.com/url/photo.jpg",: gender => "male",: birthday => "0000-06-25",: locale => "en",: hd = > "company_name.com"},: id_info => {"iss" => "accounts.google.com", "at_hash" => "HK6E_P6Dh8Y93mRNtsDB1Q", "email_verified" => "true", "sub" => " 10769150350006150715113082367 "," azp "=>" APP_ID "," електронна пошта "= > "[email protected]", "aud" => "APP_ID", "iat" => 1353601026, "exp" => 1353604926, "openid_id" => "https://www.google.com/accounts/ o8 / id? id = ABCdfdswawerSDFDsfdsfdfjdsf "}}}

Devise

Спочатку визначте свій ідентифікатор програми та секрет в конфігурації / ініціалізаціях / devise.rb. Не використовуйте фрагмент, зазначений у Використання розділ.

config. omniauth: google_oauth2, "GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", {}

Потім додайте наступне до 'config / routes.rb', щоб визначити маршрути зворотного виклику.

devise_for: користувачі,: controllers => {: omniauth_callbacks => "користувачі / omniauth_callbacks"}

Переконайтеся, що модель є універсальною. Як правило, це "/app/models/user.rb"

придумати: omniauthable,: omniauth_providers => [: google_oauth2]

Тоді переконайтеся, що ваш контролер зворотних викликів налаштований.

Користувачі класу :: OmniauthCallbacksController <Devise :: OmniauthCallbacksController def google_oauth2 @user = Користувач. from_omniauth (запит. env ["omniauth.auth"]), якщо @user. зберігалися? flash [: повідомлення] = I18n. t "devise.omniauth_callbacks.success",: kind => "Google" sign_in_and_redirect @user,: event =>: аутентифікація else session ["devise.google_data"] = запит. env ["omniauth.auth"] redirect_to кінця кінця

і прив'язувати або створювати користувача

def self. from_omniauth (access_token) data = access_token. info user = Користувач. де (: email => data ["email"]). першого користувача

Для ваших переглядів можна ввійти за допомогою:

<% = link_to "Увійти через Google", user_omniauth_authorize_path (: google_oauth2)%>

Огляд доступний за адресою https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

Одноразовий потік коду (гібридна аутентифікація)

Google описує одноразовий потік коду тут . Цей гібридний аутентифікаційний потік має значні функціональні та безпекові переваги перед чистим потоком на стороні сервера або чисто клієнтської сторони. У цьому потоці виконуються такі дії:

  1. Клієнт (веб-браузер) автентифікує користувача безпосередньо через API JS Google. Під час цього процесу різні способи можуть бути виставлені Google.
  2. Після успішної автентифікації Google повертає одноразовий код, який вимагає секрет клієнта Google (доступний лише на стороні сервера).
  3. Використовуючи запит AJAX, код відправляється на зворотній виклик Omnaauth Google OAuth2.
  4. Дорогоцінний камінь Omnaauth Google OAuth2 перевірить код через запит на сервері до Google. Якщо код є дійсним, Google повертає маркер доступу, а якщо цей користувач вперше аутентифікує цей додаток, токен оновлення. Обидва вони повинні зберігатися на сервері. Відповідь на запит AJAX вказує на успіх або невдачу цього процесу.

Цей потік є імунітетом до атак відтворення, і не передає корисної інформації людині в середині.

Дорогоцінний камінь omniauth-google-oauth2 підтримує цей режим роботи з коробки. Реалізатори просто повинні додати відповідний JavaScript до своєї веб-сторінки, і вони можуть скористатися перевагами цього потоку. Наведений приклад фрагмента JavaScript.

// Базовий гібридний приклад авторизації, який слідує за шаблоном за адресою: // https://developers.google.com/api-client-library/javascript/features/authentication#Authexample jQuery (function () {return $ .ajax ({url: 'https://apis.google.com/js/client:plus.js?onload=gpAsyncInit', dataType: 'script', cache: true});}); window.gpAsyncInit = function () {gapi.auth.authorize ({негайно: true, тип_відповіді: 'code', cookie_policy: 'single_host_origin', client_id: 'YOUR_CLIENT_ID', область: 'профіль електронної пошти'}, функція (відповідь) { return;}); $ ('. googleplus-login'), натисніть кнопку (функція (e) {e.preventDefault (); gapi.auth.authorize ({невідкладно: false, тип відповіді: 'code', cookie_policy: 'single_host_origin', client_id: 'YOUR_CLIENT_ID ', сфера:' профіль електронної пошти '}, функція (відповідь) {if (відповідь &&! response.error) {// успішною аутентифікацією Google, тепер надсилайте дані на сервер. jQuery.ajax ({type:' POST ', url: "/ auth / google_oauth2 / callback", дані: відповідь, успіх: function (data) {// відповідь від сервера}});} else {// google authentication failed}});}); };

Стан Omniauth

Якщо ви хочете скористатися параметром omniauth state, ви можете реалізувати його самостійно, використовуючи маркер csrf. Наприклад:

class ApplicationController <ActionController :: Base before_action: initialize_omniauth_state захищений def initialize_omniauth_state сесія ['omniauth.state'] = response.headers ['X-CSRF-Token'] = форма_узв.

і додайте skip_before_filter: verify_authenticity_token у вашому контролері зворотного виклику omniauth, оскільки він вже перевірений станом omniauth. І тоді вам потрібно додати: provider_ignores_state => true в ініціалізатор omniauth.

Фіксація невідповідності протоколу для redirect_uri в Rails

Просто встановіть full_host в OmniAuth на основі Rails.env.

OmniAuth . config. full_host = Rails. env. виробництво? ? 'https://domain.com': 'http: // localhost: 3000'

Ліцензія

Авторські права (c) 2015 Джош Елліторп

Цим дозвіл надано безкоштовно будь-якій особі, яка отримає копію цього програмного забезпечення та пов'язаних з ним документів ("Програмне забезпечення"), для розгляду Програмного забезпечення без обмежень, включаючи, без обмежень, права на використання, копіювання, змінення, об'єднання публікувати, поширювати, субліцензувати та / або продавати копії Програмного забезпечення, а також дозволяти особам, яким надано Програмне забезпечення, робити це за таких умов:

Вищезгадане повідомлення про авторське право та це повідомлення про дозвіл повинні бути включені до всіх копій або істотних частин Програмного забезпечення.

ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ НАДАЄТЬСЯ "ЯК Є", БЕЗ ГАРАНТІЇ БУДЬ-ЯКОГО ВИДА, ЯКЕ ВИКЛАДАЄТЬСЯ чи ВІДПОВІДНІ, ВКЛЮЧАЄ, АЛЕ НЕ ОБМЕЖУЄТЬСЯ ДО ГАРАНТІЙ ПРО КОРИСТУЮЧИЙ ТЕХНІЧНІСТЬ, ПРИМІТКА ДЛЯ СПЕЦІАЛЬНОЇ ЦІЛІ ТА НЕЗАПЕЧЕННЯ. В АВТОМОБІЛІ АВТОРИ ТА ПРОВІДНИКИ АВТОРСЬКОГО ВІДПОВІДАЛЬНОСТІ НЕ ВІДПОВІДАЮТЬСЯ ДЛЯ ПОДАТКОВОГО ЗАЯВКИ, ВІДПОВІДНОСТІ ТА ІНШОЇ ВІДПОВІДНОСТІ, ВИКЛИКУ ТА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ. ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ.

Com/accounts/ o8 / id?
Зберігалися?
Js?
Виробництво?