Using the google api with socialite

Введение

Для начала расскажу, для чего я все буду делать. Глобальная задача стоит сделать дашборд для работы маркетолога или ssm специалиста. Свести в одно место метрики из разных систем — посещаемость сайтов, монетизация, активность в группах vk, telegram и т.д. Часть этого всего я уже сделал. Буду постепенно делиться на страницах сайта. Начать рассказ решил с самого сложного — работа с google api.

В целом, работа со всеми api примерно одинаковая и не представляет особой сложности. С goolge api возникают проблемы с доступом у тех, кто первый раз все это настраивает. Там слишком много всяких сущностей. Надо пройти определенный квест и регулярно его повторять, чтобы иметь доступ к google api. Сделано все это для безопасной работы больших и сложных систем. Ну а обычным юзерам, которые просто хотят дергать curl-ом какие-то метрики, это кажется не очень простым.

В общем, расскажу обо всем по порядку, чтобы было понятно даже новичку, который только начинает работу с api. Покажу на реальном примере моего сайта и кабинета adsense к нему.

Введение

Когда я говорил семье или друзьям, что я «работаю в identity», они часто предполагали, что это означает, что я работал в правительстве, в организации выдающей водительские права, или что я помогал людям разрешать мошенничество с кредитными картами.

Однако ни то, ни другое не было правдой. Ранее я работал в компании Auth0,, которая управляет цифровой идентификацией. (Сейчас я являюсь участником программы Auth0 Ambassadors и являюсь экспертом Google Developer по SPPI: Security, Privacy, Payments, and Identity — безопасность, конфиденциальность, платежи и идентификация.)

Цифровая идентификация

Цифровая идентификация это набор атрибутов, которые определяют отдельного пользователя в контексте функции, предоставляемой конкретным приложением.

Что это значит?

Скажем, вы управляете компанией по продаже обуви онлайн. Цифровой идентификацией пользователей вашего приложения может быть номер их кредитной карты, адрес доставки и история покупок. Их цифровая идентификация зависит от вашего приложения.

Это приводит нас к …

Аутентификация

В широком смысле, аутентификация относится к процессу проверки того, что пользователь является тем, кем он себя заявляет.

Как только система сможет установить это, мы приходим к …

Стандарты

Вы можете вспомнить, что я упомянул, что аутентификация основывается на четко определенных стандартах. Но откуда эти стандарты берутся?

Есть много разных стандартов и организаций, которые управляют работой Интернета. Два органа, которые представляют для нас особый интерес в контексте аутентификации и авторизации, — это Инженерная рабочая группа по Интернету (Internet Engineering Task Force — IETF) и Фонд OpenID (OpenID Foundation — OIDF).

IETF (Internet Engineering Task Force)

IETF — это большое открытое международное сообщество сетевых инженеров, операторов, поставщиков и исследователей, которые занимаются развитием интернет-архитектуры и бесперебойной работой интернета.

OIDF (OpenID Foundation)

OIDF — это некоммерческая международная организация людей и компаний, которые стремятся обеспечить, продвигать и защищать технологии OpenID.

Теперь, когда нам известны спецификации и кто их пишет, давайте вернемся к авторизации и поговорим о:

OAuth 2.0

OAuth 2.0 является одной из наиболее часто упоминаемых спецификаций, когда речь идет о сети, а также часто неправильно представленной или неправильно понятой.

OAuth не является спецификацией аутентификации. OAuth имеет дело с делегированной авторизацией. Помните, что аутентификация — это проверка личности пользователя. Авторизация касается предоставления или отказа в доступе к ресурсам. OAuth 2.0 предоставляет доступ к приложениям от имени пользователей.

Как было до OAuth

Чтобы понять цель OAuth, нам нужно вернуться назад во времени. OAuth 1.0 был создан в декабре 2007 года. До этого, если нам требовался доступ к сторонним ресурсам, это выглядело так:

Допустим, вы использовали приложение под названием HireMe123. HireMe123 хочет настроить событие календаря (например, встречу на собеседование) от вашего имени (пользователя). HireMe123 не имеет собственного календаря; поэтому нужно использовать другой сервис под названием MyCalApp для добавления событий.

После того, как вы вошли в HireMe123, HireMe123 запросит у вас ваши учетные данные для входа в MyCalApp. Вы должны ввести свое имя пользователя и пароль на сайте HireMe123.

Затем HireMe123 используя ваш логин получить доступ к API MyCalApp, и затем сможет создавать события календаря с использованием ваших учетных данных.

Совместное использование учетных данных — это плохо!

Этот подход основывался на совместном использовании личных учетных данных пользователя из одного приложения с совершенно другим приложением, и это не очень хорошо.

Так как, HireMe123 поставил на карту защиты вашей учетной записи MyCalApp гораздо меньше. Если HireMe123 не защитит ваши учетные данные MyCalApp надлежащим образом, и они в конечном итоге будут украдены или взломаны, кто-то сможет написать несколько неприятных статей в блоге, но HireMe123 как бы останется в стороне.

HireMe123 также получает слишком большой доступ к MyCalApp от вашего имени. HireMe123 получает все те же привелегии, что и вы, потому что он использовал ваши учетные данные для получения этого доступа. Это означает, что HireMe123 может читать все ваши события календаря, редактировать их, изменять настройки и т. д.

Step 4. Button with Redirect to Google

Now, let’s add the buttons to log in. What we need:

  • Controller method to redirect to Google
  • Route to match with that Controller method
  • Buttons to point to that Route

Here’s how redirect method look like in app/Http/Controllers/Auth/LoginController.php:

Next, routes/web.php for that method:

Notice we’re restricting this route only for the providers that we specified in the config. If someone tries to redirect to some other driver, Laravel will not match this route and throw 404 error.

Finally, button – we add it to both Login and Register screens:

Here’s the code to add to both resources/views/auth/login.blade.php and resources/views/auth/register.blade.php:

Что документируется в разделе аутентификации

В документации API не нужно подробно объяснять внешним пользователям, как работает аутентификация. Отсутствие объяснений внутренних процессов аутентификации, является лучшей практикой, поскольку хакерам будет сложнее злоупотреблять API.

Тем не менее нужно объяснить необходимую информацию:

  • как получить API ключ;
  • как пройти аутентификацию запроса;
  • сообщения об ошибках, связанных с неверной аутентификацией;
  • чувствительность информации аутентификации;
  • период действия токена доступа (авторизации).

Если есть открытый и закрытый ключи, нужно объяснить, где следует использовать каждый ключ, и отметить, что закрытые ключи не должны использоваться совместно. Если разные уровни лицензий предоставляют разный доступ к вызовам API, эти уровни лицензирования должны быть явно указаны в разделе авторизации или в другом месте.

Поскольку раздел API ключей важен, и нужен разработчикам до того, как они начнут использовать API, этот раздел должен быть в начале руководства.

Шаг 2. Генерация ссылки для аутентификации

Для генерации ссылки нам потребуется адрес аутентификации и специальные параметры:

$url = 'https://accounts.google.com/o/oauth2/auth';

$params = array(
    'redirect_uri'  => $redirect_uri,
    'response_type' => 'code',
    'client_id'     => $client_id,
    'scope'         => 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile'
);

С помощью функции http_build_query, передав туда массив параметров, получим чередование ключей и значений, как в url адресе. Итак, генерируем ссылку и выводим на экран:

echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Google</a></p>';
// https://accounts.google.com/o/oauth2/auth?redirect_uri=http://localhost/google-auth&response_type=code&client_id=333937315318-fhpi4i6cp36vp43b7tvipaha7qb48j3r.apps.googleusercontent.com&scope=https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile
// Пример. В вашем случае код будет другой
http://localhost/google-auth/?code=4/UTIIYyKbcYV8ruGsLsLqeg-tA3hp.Ys3PTfXQxhUYOl05ti8ZT3b110wOewI

Сервер авторизации

Сервер авторизации — это набор конечных точек (методов API) для взаимодействия с пользователем и выдачи токенов. Как это работает?

Давайте вернемся к ситуации с HireMe123 и MyCalApp, только теперь у нас есть OAuth 2.0:

MyCalApp теперь имеет сервер авторизации. Предположим, что HireMe123 уже зарегистрирован как известный клиент в MyCalApp, что означает, что сервер авторизации MyCalApp распознает HireMe123 как объект, который может запрашивать доступ к своему API.

Предположим также, что вы уже вошли в систему с HireMe123 через любую аутентификацию, которую HireMe123 настроил для себя. HireMe123 теперь хочет создавать события от вашего имени.

HireMe123 отправляет запрос авторизации на сервер авторизации MyCalApp. В ответ сервер авторизации MyCalApp предлагает вам — пользователю — войти в систему с помощью MyCalApp (если вы еще не вошли в систему). Вы аутентифицируетесь с MyCalApp.

Затем сервер авторизации MyCalApp запросит у вас согласие разрешить HireMe123 получать доступ к API MyCalApp от вашего имени. В браузере откроется приглашение, в котором будет запрошено ваше согласие на добавление в календарь событий HireMe123 (но не более того).

Если вы скажете «да» и дадите свое согласие, то сервер авторизации MyCalApp отправит код авторизации в HireMe123. Это позволяет HireMe123 знать, что пользователь MyCalApp (вы) действительно согласился разрешить HireMe123 добавлять события с использованием пользовательского (вашего) MyCalApp.

MyCalApp затем выдаст токен доступа для HireMe123. HireMe123 может использовать этот токен доступа для вызова MyCalApp API в рамках разрешенных вами разрешений и создания событий для вас с помощью MyCalApp API.

Ничего плохо больше не происходит! Пароль пользователя знает только MyCalApp. HireMe123 не запрашивает учетные данные пользователя. Проблемы с совместным использованием учетных данных и слишком большим доступом больше не являются проблемой.

А как насчет аутентификации?

На данный момент, я надеюсь, стало ясно, что OAuth предназначен для делегированного доступа. Это не распространяется на аутентификацию. В любой момент, когда аутентификация включалась в процессы, которые мы рассмотрели выше, вход в систему осуществлялся любым процессом входа в систему, который HireMe123 или MyCalApp реализовали по своему усмотрению. OAuth 2.0 не прописывал, как это должно быть сделано: он только покрывал авторизацию доступа сторонних API.

Так почему же аутентификация и OAuth так часто упоминаются вместе друг с другом?

Service ID

Сохраненные аккаунты однозначно определены с помощью ключа, состоящего из свойства аккаунта Username и Service ID. Этот самый Service ID — это любая строка, которая используется при сохранении и извлечении аккаунтов из хранилища.

Вот пример кода для использования Service ID при сохранении, извлечение и удаление данных из хранилища.

Сохранение данных в хранилище

C#

Account account = new Account();
AccountStore.Create(this).Save(account, «Google»);

1
2

Account account=newAccount();

AccountStore.Create(this).Save(account,»Google»);

Извлечение сохраненных данных из хранилища

C#

var cache = AccountStore.Create().FindAccountsForService(«Google»).FirstOrDefault();

1 varcache=AccountStore.Create().FindAccountsForService(«Google»).FirstOrDefault();

Удаление данных из хранилища

C#

AccountStore.Create(this).Delete(cache, «Google»);

1 AccountStore.Create(this).Delete(cache,»Google»);

Совет 6. Войдите в систему с помощью электронной почты или имени пользователя

По умолчанию пользователи Laravel аутентифицируются с помощью электронной почты и пароля. Но что делать, если Ваш идентификатор не является электронной почтой? Какое-нибудь имя пользователя, например.

Вы можете легко изменить его, переопределив один метод из .

Вот значение по умолчанию:

Вы можете скопировать это в свой  и просто изменить значение:

Давайте сделаем еще один шаг вперед. Что делать, если ваши пользователи могут войти в систему с помощью электронной почты или имени пользователя? Таким образом, есть поле ввода под названием “Электронная почта/имя пользователя”, и они могут ввести одно или другое.

Давайте добавим “трюк” к тому же методу сверху. Мы проверяем, является ли введенная строка электронной почтой, в противном случае мы рассматриваем ее как имя пользователя. Эта проверка-функция PHP, даже не Laravel.

Аутентификация пользователей вручную

Обратите внимание, что вам не обязательно использовать контроллеры аутентификации, включенные в Laravel. Если вы решите удалить эти контроллеры, вам нужно будет управлять аутентификацией пользователей напрямую, используя классы аутентификации Laravel

Не волнуйтесь, это круто!

Мы получим доступ к службам аутентификации Laravel через фасад , поэтому нам нужно обязательно импортировать фасад в начало класса. Затем давайте проверим метод :

Метод вернет , если аутентификация прошла успешно. В противном случае будет возвращено .

Метод в перенаправителе перенаправит пользователя на URL-адрес, к которому он пытался получить доступ, прежде чем его перехватило промежуточное программное обеспечение аутентификации. Этому методу может быть предоставлен резервный URI, если предполагаемый пункт назначения недоступен.

Определение дополнительных условий

При желании вы также можете добавить дополнительные условия в запрос аутентификации в дополнение к электронной почте и паролю пользователя. Например, мы можем проверить, что пользователь отмечен как » активный «:

Доступ к определенным экземплярам защиты

Вы можете указать, какой экземпляр защиты вы хотите использовать, используя метод на фасаде . Это позволяет вам управлять аутентификацией для отдельных частей вашего приложения, используя полностью отдельные модели аутентификации или пользовательские таблицы.

Имя охранника, переданное методу , должно соответствовать одному из охранников, настроенных в вашем файле конфигурации :

Выход из системы

Для выхода пользователей из вашего приложения вы можете использовать метод фасада . Это очистит информацию аутентификации в сеансе пользователя:

Если вы хотите предоставить функцию » запомнить меня » в своем приложении, вы можете передать логическое значение в качестве второго аргумента методу , который будет поддерживать аутентификацию пользователя на неопределенный срок или до тех пор, пока он выйти из системы вручную. Ваша таблица должна включать столбец строки , который будет использоваться для хранения токена » запомнить меня «.

Если вы » запоминаете пользователей «, вы можете использовать метод , чтобы определить, был ли пользователь аутентифицирован с помощью файла cookie » запомнить меня «:

Аутентификация экземпляра пользователя

Если вам нужно зарегистрировать существующий пользовательский экземпляр в вашем приложении, вы можете вызвать метод с пользовательским экземпляром. Данный объект должен быть реализацией контракта . Модель , включенная в Laravel, уже реализует этот интерфейс:

Вы можете указать экземпляр защиты, который хотите использовать:

Аутентифицировать пользователя по идентификатору

Чтобы авторизовать пользователя в приложении по его ID, вы можете использовать метод . Этот метод принимает первичный ключ пользователя, которого вы хотите аутентифицировать:

Однократная аутентификация пользователя

Вы можете использовать метод для входа пользователя в приложение для одного запроса. Никакие сеансы или файлы cookie не будут использоваться, что означает, что этот метод может быть полезен при создании API без отслеживания состояния:

Образцы разделов авторизации

Ниже приведены несколько примеров разделов авторизации в документации API.

SendGrid

API ключ SendGrid

SendGrid предлагает подробное объяснение ключей API, начиная с основ, поясняя: «Что такое ключи API?». Контекстно раздел ключей API появляется вместе с другими разделами по управлению учетными записями.

авторизация Twitter

В Twitter подробный пример оправдан и предоставлен, поскольку требования к авторизации OAuth 2.0 немного сложнее.

Amazon Web Services

авторизация Amazon

Amazon использует HMAC. Процесс достаточно сложный, чтобы включить полноценную диаграмму, показать шаги, которые должны выполнить пользователи.

Dropbox

Авторизация в Dropbox

Как и Twitter, Dropbox также использует OAuth 2.0. Их документация включает в себя не одну, а две диаграммы и подробное объяснение процесса.

4: Создание миграций

Инструмент командной строки artisan поставляется вместе с Laravel. Он предлагает ряд вспомогательных команд, при помощи которых можно управлять приложением и загружать новые классы. Чтобы создать новый класс миграции, используйте команду make:migration:

Laravel определяет операцию, которую необходимо выполнить (create), имя таблицы (places), а также запрашивает, должна ли данная миграция создать новую таблицу. Все эти данные включены в описательное имя в команде make:migration. Вывод будет выглядеть так:

После этого в каталоге приложения database/migrations появится новый файл. С помощью метки времени, которая включается в этот сгенерированный файл, Laravel определяет, в каком порядке нужно выполнять миграции.

Откройте этот файл миграции. Обязательно укажите в этой команде имя вашего файла:

В файле находится класс по имени CreatePlacesTable:

Этот класс включает два метода: up и down. Они содержат код загрузки, который можно расширить (например, с его помощью вы можете определить, что будет происходить при выполнении этой миграции или в случае отката изменений).

Давайте изменим метод up, чтобы таблица places отражала такую структуру:

  • id: первичный ключ.
  • name: название города.
  • visited: посещен этот город или нет.

Конструктор Laravel предлагает методы для создания, обновления и удаления таблиц в БД. Класс Blueprint позволяет определить структуру таблицы и поддерживает , с помощью которых можно абстрагировать определения каждого поля в таблице.

Сгенерированный автоматически код определяет поле первичного ключа id. Метод timestamps создает два поля datetime (они автоматически обновляются классами соответствующей БД при помещении или обновлении данных в таблице). Также нам нужно добавить поля name и visited.

Поле name будет иметь тип string, а visited – тип boolean. Полю visited мы зададим значение по умолчанию 0 (и если этому полю не будет передано значение, это будет означать, что данный город еще не посещен). В итоге метод up выглядит так:

Примечание: Полный список доступных типов можно найти в документации .

Добавив две выделенные красным строки в сценарий миграции, сохраните и закройте файл.

Теперь вы можете выполнить свою миграцию с помощью artisan migrate, но это создаст пустую таблицу, а нам нужно иметь возможность добавлять в нее данные. Далее мы покажем, как сделать это с помощью сидеров.

Install Auth Scaffolding in Laravel 8

Here, you can opt for bootstrap auth or vue auth. Both will be working as same. I will opt vue auth. So, hit the below command in the terminal.

After adding the vue auth package, you will require to install npm. The npm will provide the front-end dependencies for UI auth.

After installing npm the CSS and js file will build for the use.


CSS and js build after npm install

After that, you can test the application. As a result, we have the Login and Register option provided by the Laravel UI.


Laravel Homepae with UI

When you will click on the Login option, it will open the below result.


Laravel UI Auth Login page

In the next step, we have to add the socialite package.

Описание приведенной выше схемы

Давайте кратко рассмотрим приведенную выше схему.

  1. Когда пользователь вводит свои учетные данные на соответствующей странице (как показано на рисунке ниже), он может предоставить приложению доступ к своим данным.
  2. Приложение запросит у владельца ресурса (например, сервера Google) предоставления доступа к соответствующим данным пользователя, как только тот войдет в систему.
  3. На этом этапе владелец ресурса посредством представленного ниже диалогового окна поинтересуется у пользователя тем, дает ли тот свое согласие на предоставление доступа этому приложению или нет?
  4. Если пользователь нажимает на Allow (Разрешить), тогда владелец ресурса получает Grant Access, и, таким образом, приложение может получить доступ к данным пользователя через соответствующий аккаунт в социальной сети.
  5. Таким образом, после получения Grant access, аккаунт обеспечивает приложение токеном авторизации.
  6. С помощью токена авторизации приложение будет запрашивать необходимую ему информацию о пользователе из аккаунта соцсети.
  7. И, наконец, аккаунт соцсети представит необходимые пользовательские данные. И после получения этих данных приложение может продолжить свою работу.

Что предстоит сделать

В начале статьи мы говорили о том, как выглядит кейс с точки зрения пользователя, но как это работает с технической точки зрения?

Что ж, учитывая пользователя, мы должны иметь возможность отправить ему уникальную ссылку, которая, когда он нажимает на нее, вводит его в свою учетную запись.

Это говорит нам о том, что нам, вероятно, потребуется сгенерировать какой-то уникальный токен, связать его с пользователем, пытающимся войти в систему, построить маршрут, который смотрит на этот токен и определяет, действителен ли он, а затем выполняет вход пользователя в систему. Также нужно чтобы эти токены использовались только один раз и были действительны только в течение определенного времени после того, как они были сгенерированы.

Поскольку нам нужно отслеживать, был ли уже использован токен, мы собираемся сохранить их в базе данных. Также будет удобно отслеживать, какой токен принадлежит какому пользователю, а также, был ли токен использован или нет, и срок его действия уже истек.

Шаг 4. Регистрация приложения в Google

Для подключения протокола авторизации Google OAuth необходимо использовать уникальный идентификатор приложения (Client ID) и секретный код (Client secret). Код и ID получают на сайте Google Developers Console в ходе создания нового проекта.

Откройте раздел Credentials, затем последовательно выберите OAuth и Create new Client ID. В результате вы увидите то же самое, что и на скриншотах, приведенных ниже.

После создания проекта и регистрации приложения скопируйте полученные идентификатор и секретный код. Внесите данные в файл конфигурации config/services.php, как показано ниже.

return [

    ....

    'google' => [

        'client_id' => 'app id',

        'client_secret' => 'add secret',

        'redirect' => 'http://localhost:8000/auth/google/callback',

    ],

]

Правильное удаление Realme ID со смартфона

Вы больше не собираетесь использовать аккаунт Realme? Тогда его желательно полностью удалить из системы, чтобы обезопасить свои личные данные. Как сообщает администрация сервиса, после уничтожения учетной записи вы не сможете пользоваться облачным сервисом и прочими фирменными приложениями

Чтобы сделать всё правильно и не допустить ошибок, советуем обратить внимание на пошаговую инструкцию:

  1. Открываем настройки смартфона.
  2. Переходим во вкладку «Аккаунт», затем – «Вход и безопасность».
  3. В нижней части экрана находим кнопку «Больше помощи» (More Help) и нажимаем на неё.
  4. В браузере открывается форма с авторизацией, куда нужно вписать все данные от учетной записи.
  5. Когда всё готово, еще раз обдумываем решение и выбираем «Delete account» или «Удалить аккаунт».
  6. Подтверждаем действие.

К сожалению, выполнить обход удаления аккаунта Realme пока что не представляется возможным. Даже если вы откажетесь от использования сервиса, все личные данные по-прежнему будут храниться на серверах. Системой не предусмотрено автоматическое удаление профиля в случае неактивности.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: