Авторизация через oauth приложение облако для ios
Каждый запрос, отправляемый вашим приложением в Google My Business API, должен содержать токен авторизации. Этот токен идентифицирует пользователя или приложение сервисам Google, что необходимо для доступа к Google My Business API. В вашем приложении для авторизации запросов должен использоваться протокол OAuth 2.0.
Реализация OAuth 2.0 позволяет получить следующие преимущества:
- Защита доступа к данным владельца компании.
- Аутентификация владельца компании при входе в его аккаунт Google.
- Проверка прав партнерской платформы или приложения получать или изменять данные об адресах с явного согласия владельца компании. Владелец компании может отозвать эти права.
- Аутентификация партнерской платформы.
- Возможность партнерской платформы выполнять онлайн- и офлайн-действия от имени владельца компании: отвечать на отзывы, создавать публикации, обновлять меню и т. п.
Доступ к API с помощью OAuth 2.0
Прежде чем начинать работу, вам понадобится создать проект Google Cloud и включить Google My Business API. Подробнее об этом рассказывается в руководстве по базовой настройке.
Настройка OAuth и окна для получения согласия пользователей
Чтобы создать учетные данные и настроить окно для получения согласия пользователей, выполните следующие действия:
- На странице "Учетные данные" в API Console нажмите Создать учетные данные и выберите "Идентификатор клиента OAuth" в раскрывающемся списке.
- Выберите тип своего приложения, укажите необходимую информацию и нажмите Создать.
- Нажмите Сохранить.
- Обновите Настройки окна OAuth для получения согласия пользователей. Здесь вы можете изменить название приложения и его логотип, а также добавить ссылку на условия использования и политику конфиденциальности своего сервиса.
На следующем рисунке показаны поля "Название приложения" и "Логотип приложения" окна OAuth для получения согласия пользователей:
На следующем рисунке показаны дополнительные поля окна OAuth для получения согласия пользователей:
На следующем рисунке показан пример окна, которое увидит пользователь:
Способы внедрения OAuth 2.0
Для внедрения OAuth 2.0 можно использовать следующие технологии и инструменты:
Далее в этой статье приводится подробное описание каждого способа внедрения OAuth 2.0 в приложение.
Область авторизации
В качестве области авторизации OAuth необходимо указать одно из следующих значений:
Область plus.business.manage более не поддерживается. Она остается доступной, чтобы обеспечить обратную совместимость существующих решений.
Клиентские библиотеки
В приведенных здесь примерах для конкретных языков программирования показана реализация OAuth 2.0 с помощью клиентских библиотек Google API. Чтобы выполнить код из примера, сначала необходимо установить клиентскую библиотеку для соответствующего языка.
Клиентские библиотеки доступны для следующих языков:
Автономный доступ
Вам может потребоваться совершать вызовы Google My Business API от имени пользователя, даже когда он не в сети. Внедрение этой функции рекомендуется для всех платформ. Поскольку тогда вы сможете управлять информацией о компаниях (например, изменять и просматривать ее) в любое время после того, как пользователь вошел в аккаунт и предоставил вам полномочия.
В приведенном ниже примере кода показано, как реализовать автономный доступ в приложении. О том, как выполнить этот код, рассказывается здесь.
Только онлайн-доступ
Чтобы упростить реализацию, можно совершать вызовы Google My Business API без кеширования токенов обновления. Впрочем, тогда платформа сможет совершать вызовы от имени пользователя, только если этот пользователь вошел в свой аккаунт и сейчас присутствует в сети.
В приведенном ниже примере кода показано, как реализовать поддержку входа с аккаунтом Google и как совершить вызов API от имени конкретного пользователя. После того как пользователь совершает вход, используя свой аккаунт Google, и предоставляет согласие вашему приложению, вы получаете токен доступа. Этот токен доступа является идентификатором пользователя. Токен нужно указать в заголовке запроса Google My Business API.
О том, как выполнить этот код, рассказывается здесь.
Выполнение кода из примера
Чтобы выполнить код из приведенного здесь примера, сделайте следующее:
-
Сохраните фрагмент кода в файле с названием index.html . Укажите в этом файле свой идентификатор клиента.
Запустите веб-сервер из своего рабочего каталога со следующей командой:
Python 2.X
Python 3.X
На странице Учетные данные в API Console выберите используемый идентификатор клиента.
Загрузите следующий URL в браузере:
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Атака возможна из-за ошибки в реализации протокола аутентификации OAuth 2.0.
Группа специалистов из Университета Гонконга продемонстрировала новый метод, позволяющий удаленно получить доступ к любой учетной записи в Android- и iOS-приложениях без ведома жертвы.
В рамках исследования эксперты проанализировали 600 наиболее популярных в США и Китае Android-приложений, 182 из которых поддерживали технологию единого входа (Single Sign-On). В 41% приложений исследователи обнаружили проблему, связанную с реализацией протокола авторизации OAuth 2.0. Данный протокол, позволяющий реализовать безопасную аутентификацию пользователей, предоставляет возможность подписчикам Google, Facebook, Microsoft или Twitter получить доступ из своих учетных записей на другие web-сайты.
При использовании OAuth 2.0 для авторизации в стороннем приложении, программа обращается к ID-провайдеру (скажем, Facebook) для верификации данных аутентификации. В случае, если информация достоверна, Facebook отправляет маркер доступа (Access Token), который затем передается на сервер мобильного приложения. В результате пользователь может авторизоваться в приложении, используя учетные данные Facebook.
Как оказалось в ходе анализа, в огромном числе Android-приложений некорректно реализован механизм, проверяющий наличие взаимосвязи между пользователем и ID-провайдером. То есть, сервер проверяет только идентификатор пользователя. Как поясняют эксперты, злоумышленники могут удаленно загрузить уязвимое приложение, авторизоваться при помощи собственных учетных данных, а затем изменить логин на имя пользователя жертвы при помощи сервера, способного модифицировать данные, отправленные Facebook, Google или другими сервисами. Таким образом атакующие могут получить доступ ко всем данным в приложении.
Например, хакеры могут взломать приложения для планирования путешествий или бронирования гостиничных номеров и получить доступ к планировщику жертвы, оплатить номер в отеле или похитить персональную информацию, такую как данные банковского счета или адрес проживания.
Разбираемся, как работает протокол OAuth 2.0 и OpenID Connect. Почему Authorization Code Grand лучший способ получения access token.
Если коротко OAuth 2.0 — протокол авторизации, позволяющий выдать одному сервису (приложению) права на доступ к ресурсам пользователя на другом сервисе. Протокол избавляет от необходимости доверять приложению логин и пароль, а также позволяет выдавать ограниченный набор прав, а не все сразу.
В этой статье рассмотрим историю возникновения и схему работы. Разберемся в чем отличие OAuth 2.0 от OpenID Connect и что такое SSO.
История возникновения OAuth
Авторизацией через социальные сети никого уже не удивишь. Нажимаешь кнопку соц сети, вжух и ты авторизовался на новом сайте. Сайт получил твоё ФИО, фотку и прочие данные. Но так было не всегда.
В «каменном веке» интернета все было проще. Вы просто давали свой логин и пароль от одного сервиса другому, чтобы тот вошел в вашу учетную запись и получил любую необходимую ему информацию.
С помощью этого стандарта вы позволяете приложению считать данные или использовать функции другого приложения от вашего имени, не сообщая ему свой пароль. Класс!
OAuth 1.0 не используется. Забудьте о нем. Используйте OAuth 2.0
Главным недостатком OAuth 1.0 была слишком большая сложность данной версии.
Начнем разбор OAuth 2.0 с ролей. Всего есть 4 роли:
- Владелец ресурса.
- Клиент.
- Сервер ресурсов.
- Авторизационный сервер.
Далее мы рассмотрим каждую из ролей.
Сервер ресурсов
На сервере ресурсов лежат ваши данные. В случае с примером выше ваши контакты Gmail это ресурс, а лежат они на серверах Gmail.
Клиент
Клиент это сервис, которому требуется доступ к вашим ресурсам. Например, Facebook требуется доступ к контактам Gmail.
Авторизационный сервер
В данном примере он принадлежит Google, так как он хранит ваши данные.
Стандарт не запрещает вам объединить Сервер ресурсов и Авторизационный сервер
Базовая схема протокола
Вернемся к нашему примеру про Facebook и Gmail. На анимации ниже, я постарался схематично изобразить, как реализовать этот пример правильно с помощью Oauth2. Стоит учитывать, что у Google есть свой сервер авторизации, который отвечает за авторизацию на любом сервисе Google. Поэтому Gmail только хранит ресурсы, но не отвечает за авторизацию.
Весь смысл в том, что Клиент должен получить каким-то образом от авторизационного сервера access_token . Способов этих четыре, о них мы поговорим дальше. Используя этот access_token Клиент может использовать его в запросах к Серверу ресурсов, чтобы получать какие-то данные.
Это строка, которая является альтернативой логину и паролю.
Особенности Access Token:
- Ограниченное время жизни.
- Его можно отозвать. Если есть подозрение, что токен украли, то мы просто запрещаем получать данные с помощью этого токена.
- Компрометация токена не значит компрометирование логина и пароля. Из токена никак не получить логин и пароль.
- По токену может быть доступна только часть данных (scope). Клиент запрашивает список разрешений, которые необходимы ему для работы, а Владелец ресурсов решает выдать такие права или нет. Например, можно выдать права только на просмотр списка контактов, тогда читать письма или редактировать контакты будет нельзя.
Помимо access_token Авторизационный сервер может выдавать также refresh_token. Это токен, который позволяет запросить новый access_token без участия Владельца ресурсов. Время жизни у такого токена намного больше access_token и его потеря гораздо серьезнее.
Не все клиенты могут гарантировать сохранность client_secret , поэтому он есть не у всех. Например, SPA без бэкенда, теоретически достать оттуда можно что угодно.
Существует возможность регистрировать клиентов динамически: RFC 7591 и RFC 7592.
Способы получения Access Token
Всего есть 4 способа:
- По авторизационному коду (Authorization Code Grand). Самый сложный и самый надежный способ.
- Неявно (Implicit)
- По логину и паролю пользователя (Resource Owner Password Credential). Только для безопасных клиентов, заслуживающих полного доверия.
- По данным клиента (Client Credentials). Получаем токен по client_id и client_secret .
Client Credentials
Начнем разбор с самой простой схемы. Этот способ придуман для межсерверного взаимодействия. У нас есть два сервера API1 и API2, и им надо как-то общаться.
2. Взамен API 1 получает access_token , с помощью которого может обратиться к API 2.
3. API 1 обращается к API 2.
4. API 2 получает запрос с access_token и обращается к авторизационному серверу для проверки действительности переданного токена (RFC 7662).
Resource Owner Password Credential
Эта схема не рекомендуется к использованию! В стандарте так и написано, если вы никакие другие схемы не можете сделать, то используйте эту.
- Владелец ресурсов передает свой логин и пароль Клиенту.
- Клиент отправляет Авторизационному серверу логин и пароль клиента, а так же свой client_id и client_secret .
3. Если предоставленные пользователем учетные данные успешно аутентифицированы, сервер авторизации вернет ответ application/json , содержащий access_token :
Authorization Code Grand
Является одним из наиболее распространённых типов разрешения, поскольку он хорошо подходит для серверных приложений, где исходный код приложения и секрет клиента не доступны посторонним.
Этот способ рекомендуемый. Используйте его, и только если это невозможно, посмотрите на другие способы. Исключением является межсерверное общение.
- Пользователь на сайте нажимает кнопку авторизации, например через Facebook.
- Происходит редирект на авторизационный сервер.
- Если активной сессии нет, то Пользователь должен залогиниться. Если активная сессия есть, то просто подтвердить авторизацию.
Пример авторизационного запроса
- response_type - Обозначает тип учетных данных, которые возвращает авторизационный сервер. Для этого способа значение должно быть code .
- redirect_uri - URL-адрес, на который авторизационный сервер будет перенаправлять браузер после авторизации пользователя. Код авторизации будет доступен в параметре code .
Так как code попадает в браузер и ничем не защищен, то это точка уязвимости. Поэтому на авторизационный код накладываются следующие ограничения:
- Код одноразовый
- Время жизни кода очень мало
5. Теперь, когда у вас есть код авторизации, вы должны обменять его на токены. Используя извлеченный код авторизации из предыдущего шага, вам нужно будет выполнить POST на URL-адрес токена.
Implicit Grant
Теперь у нас сайт без бэкенда - SPA.
Так как access_token попадает в браузер, то существует возможность его достать.
OpenID Connect
OAuth 2.0 разработан только для авторизации — для предоставления доступа к данным и функциям от одного приложения другому. OpenID Connect (OIDC) — это тонкий слой поверх OAuth 2.0, добавляющий сведения о логине и профиле пользователя, который вошел в учетную запись.
OpenID Connect позволяет реализовывать сценарии, когда единственный логин можно использовать во множестве приложений, — этот подход также известен как single sign-on (SSO)
Поток (flow) OpenID Connect выглядит так же, как и в случае OAuth 2.0. Единственная разница в том, что в первичном запросе используемый конкретный scope — openid, — а Клиент в итоге получает как access_token , так и id_token .
ID Token — это особым образом отформатированная строка символов - JSON Web Token или JWT. Сторонним наблюдателям JWT может показаться непонятной абракадаброй, однако Клиент может извлечь из JWT различную информацию, такую как ID, имя пользователя, время входа в учетную запись, срок окончания действия ID Token’а, наличие попыток вмешательства в JWT.
Эта статья посвящена детальному разбору JWT и его возможностей. Мы изучим структуру токена и построим его с нуля. Затем рассмотрим наиболее распространенные способы использования.В случае OIDC также имеется стандартный способ, с помощью которого Клиент может запросить дополнительную информацию о пользователе от Сервера авторизации, например, адрес электронной почты, используя access_token .
Заключение
Социальные сети, потоковая передача контента, воркспейсы – везде мы заходим через учетные записи, которые могут содержать личную информацию. Изолированные приложения становятся взаимосвязанными: Twitter позволяет новостным сайтам твитить напрямую, Discord ищет предполагаемых друзей на Facebook, а Jira создает учетки с помощью профилей Github.
Раньше для авторизации сайты и приложения использовали простую схему логин/пароль. Это существенно усложняло задачу взаимодействия приложений: чтобы позволить приложению получить доступ к данным другого приложения, требовалось передать учетные данные. Но это порождало множество проблем, связанных с небезопасным хранением учетных данных и получением неограниченного доступа. Для обеспечения делегированного доступа был создан открытый протокол авторизации OAuth.
Разберем несколько общих терминов. Для упрощения под OAuth будем подразумевать OAuth 2.0.
- Владелец ресурса ( Resource Owner ) – объект, предоставляющий доступ к защищенным ресурсам.
- Ресурсный сервер ( Resource Server ) – сервер, на котором размещаются защищенные ресурсы и обрабатываются запросы на доступ.
- Клиент ( Client ) – приложение, которое хочет получить доступ к ресурсному серверу и выполнять действия от имени владельца ресурса. Конфиденциальным клиентам (серверные приложения) можно доверять надежное хранение токена, необходимого для доступа к ресурсам, а публичным (мобильные и JS-приложения) – нельзя.
- Сервер авторизации ( Authorization Server ) – сервер, который знает владельца ресурса и может авторизовать клиента для доступа к ресурсному серверу.
OAuth создан для предоставления сторонним приложениям ограниченного доступа к защищенным ресурсам без риска для данных пользователя. Это похоже на то, как работает режим Valet Mode в Tesla. Этот режим владелец может выставить, если, к примеру, передает машину в сервис. Компьютер автомобиля понимает, что необходимо работать с урезанной функциональностью: ограничить максимальную скорость и ускорение, блокировать багажник и бардачок .
В том же ключе OAuth используется в социальных сетях. Например, при авторизации в Spotify через Facebook приложение Spotify получает доступ лишь к ограниченному набору данных.
Рис. 1. Используя OAuth, клиент (Spotify) может получить доступ к ресурсному серверу (Facebook) без учетных данных от имени владельца ресурса (Боба).
При выводе всплывающего окна OAuth работает в фоновом режиме (Рис. 2):
Выше мы обсудили абстрактный дизайн OAuth . Внутри этой системы существуют также области и токены, разрешения и потоки. Разберемся детальнее.
Области и токены OAuth
Области и токены OAuth реализуют детализированное управление доступом. Похоже на киносеанс: область – название фильма, который вы имеете право смотреть, токен – билет, что может проверить лишь сотрудник конкретного кинотеатра.
Вернемся к Рис. 2. Сервер авторизации имеет API, отличающийся от ресурсного сервера. Сервер авторизации служит для проверки и авторизации клиента, в то время как сервер ресурсов хранит запрашиваемые ресурсы. Чтобы ресурсный сервер знал, следует ли выполнять запрос на получение информации, он должен знать, авторизован ли запрашивающий. Тут и появляется токен, чтобы сообщить серверу ресурсов, что запрашивающий был проверен сервером авторизации и имеет разрешение на выполнение запроса. При использовании токенов в качестве прокси-сервера необходимость предоставления учетных данных отпадает. Данные маркеры зашифрованы, но при декодировании сервером ресурсов из них можно вытащить значение области.
Условно можно выделить четыре типа областей:
- доступ для чтения;
- доступ на запись;
- доступ для чтения и записи;
- без доступа.
Определение области действия – мощный инструмент для определения того, какой уровень допуска к пользовательским данным разрешен третьим лицам. Чтобы понять, как это можно использовать, прочитайте документацию Slack и Google , которые демонстрируют различные вариации параметров настройки.
Существует еще один тип токенов – обновляемый (refresh tokens), который используется для автоматического получения нового экземпляра, когда старый больше не функционируют ( e xpired). Такие приложения, как Facebook, могут обеспечить ещё б ó льшую степень защиты, периодически проверяя авторизацию с помощью принудительного использования дополнительных refresh -токенов для получения access -токенов . R efresh tokens имеют важную особенность: они могут быть отозваны путем их аннулирования и возврата клиентского доступа к привилегированным ресурсам.
Рис. 3. OAuth поток
Разрешения и потоки OAuth
Возвращаясь к аналогии с кинотеатром, есть два способа получить билет: покупка в кинотеатре и покупка онлайн. Выбранный метод влияет на последовательнось действий для получения билета. Покупка в театре выглядит так:
- приехать к кинотеатру;
- войти в него;
- пройти к кассе;
- найти сеанс;
- пообщаться с сотрудником кассы;
- оплатить;
- получить билет.
- перейти на сайт театра;
- найти сеанс;
- добавить билет в заказ;
- оплатить;
- получить билет на e-mail.
Разрешения (grants) диктуют клиенту порядок операций по получению access-токена. Этот уникальный порядок называется потоком.
Вся коммуникация между владельцем ресурса, клиентом и сервером авторизации происходит через строки запроса с параметрами. В этих параметрах содержится информация, необходимая серверу авторизации для понимания того, какому потоку следовать:
-
(Authorization Code Grant) – наиболее распространенный тип разрешений (Рис. 4). Клиент получает уникальный код, выданный сервером авторизации, который затем обменивается на токен. – этот вариант используется для публичных клиентов, которым нельзя доверять хранение учетных данных. Используя расширение PKCE (Public Key for Code Exchange), клиент и сервер обмениваются хэшем, чтобы убедиться, что связь не скомпрометирована.
– иногда клиенты запрашивают доступ для себя, а не для владельца ресурса. Эти экземпляры используют внутренние службы, которым требуется доступ к облачному хранилищу. В этом случае клиент сделает запрос, включающий client_id и client_secret , которые сервер авторизации проверяет для выдачи access-токенов. Этот тип разрешений должен использоваться только с конфиденциальными клиентами.
– используется для устройств, подключенных к интернету, которые не имеют браузеров или снабжены неудобными виртуальными клавиатурами, например, игровая консоль или Smart TV.
Изучим описанные концепции на примере. Teleport – опенсорсный инструмент удаленного доступа, позволяющий юзерам входить в систему через Github single sign-on (SSO) с использованием OAuth. Действующие лица :
- Client : Teleport.
- Resource Owner : пользователь Teleport.
- Authorization Server : сервер авторизации Github ( GAS ).
- Resource Server : ресурсный сервер Github ( GRS ).
Рассмотрим поток шаг за шагом.
Шаг 1. Пользователь Teleport получает доступ к приложению Teleport.
Шаг 2. Приложение предлагает пользователю Teleport войти с помощью Github SSO.
Собрав воедино все, получим следующую строку приглашения:
Шаг 4. Как только GAS получит запрос, он проверит client_id в реестре. Зная, что Teleport ожидает код авторизации, GAS отправит пользователя обратно на URL-адрес с переданными параметрами:
Шаг 5. После получения кода Teleport автоматически попросит GAS обменять код на токен с параметрами code , redirect_uri и client_id . Для обмена используется POST- запрос :
Шаг 6. Используя client_secret и code , сервер авторизации может проверить запрос клиента Teleport и выдать токен, в который зашивается область и время жизни:
Шаг 7. Теперь, когда маркер получен, делаем запрос к API от имени пользователя Teleport и получаем желаемое:
Шаг 8. Н аконец, GitHub API пропускает юзера.
Несмотря на часто упускаемое из виду удобство, OAuth-это сложный протокол, реализация которого потребует времени. Пример, который мы рассмотрели выше – один из сотен вариантов того, как может выглядеть поток OAuth.
Если вы увлеклись веб-разработкой, но ищите помощь наставника, мы советуем обратить внимание на курс факультета Веб-разработки GeekBrains, где вы получите готовую базу навыков и необходимую поддержку. Кстати, на курсе большое внимание уделяется безопасности как клиентской, так и серверной части веб-приложения.
Курс поможет освоить профессию веб-разработчика, получить диплом и создать портфолио с рабочими проектами. В случае успешного прохождения команда университета поможет с трудоустройством. Ознакомиться с программой и отзывами можно, нажав расположенную ниже кнопку.
Читайте также: