Поставщик удостоверений G Suite для приложения на основе браузера, управляемого AWS

Я знаю, как создать приложение с проверкой подлинности Google с помощью google-signin-client_id 3089273xx-xxxxxxxxxxxx.apps.googleusercontent.com и <script src="https://apis.google.com/js/platform.js" async defer></script>, но проблема в том, что я не смог ОГРАНИЧИТЬ вход в систему только на экземпляр G Suite моей компании.

Приложение, которое у меня есть, представляет собой «бессерверный» пакет JS, размещенный на S3. Вошедший в систему токен Google привязан к роли AWS, которая получает доступ к конфиденциальным ресурсам.

Итак, типичные решения для проверки электронной почты googleUser.getBasicProfile() или передать параметр hd не имеет никакого смысла с точки зрения безопасности, поскольку ими можно манипулировать с помощью инструментов разработки браузера IIUC.

Есть ли какой-то другой API Google, который я мог бы использовать, или стратегию, которую я мог бы применить? Я предполагаю, что решение придет в виде специального google-signin-client_id для домена моей компании, размещенного в G Suite. Вот как это связано с ролью в AWS:

Аутентификация Google AWS IAM

Я знаю, что могу дублировать своих пользователей в «пулах пользователей» AWS и использовать Cognito, но я пытаюсь создать «единый источник правды» для сотрудников компании и облегчить бремя администрирования.


person hendry    schedule 18.10.2016    source источник


Ответы (2)


ОБНОВЛЕНИЕ: этот ответ небезопасен, так как если вы просто удалите hosted_domain, вы сможете аутентифицироваться с любым логином Google.

После перехода на https://developers.google.com/identity/work/it-apps и используя GAPI напрямую, я обнаружил, что могу сделать

    GAPI.auth2.init({
        client_id: CLIENT_ID,
        hosted_domain: 'example.com'
    })

Затем, как указано в документации, вы настраиваете Управление доступом клиента API< /сильный>

Авторизованные клиенты API

Так что теперь только пользователи @example.com в Gsuite могут получить доступ к этому JS-приложению! Это заняло недели, чтобы понять. Итак, в заключение, как пройти аутентификацию с помощью Google в бессерверном приложении на базе AWS:

  1. Настройте идентификатор клиента с помощью идентификатора клиента OAuth с исходными URL-адресами из белого списка из https://console.developers.google.com/apis/credentials
  2. В AWS IAM настройте роль в Google как (веб) поставщик удостоверений с идентификатором клиента
  3. Добавьте свой идентификатор клиента https://admin.google.com/AdminHome?chromeless=1#OGX:ManageOauthClients, как описано здесь https://developers.google.com/identity/work/it-apps, чтобы ограничить ваше приложение доменом вашей компании.

Итак, теперь у нас есть статически размещенное приложение, доступ к конфиденциальным платным API-интерфейсам AWS ограничен только сотрудниками компании.

person hendry    schedule 27.10.2016

Я попробовал 3 разных варианта, первый сработал для моего сценария:

Первый вариант — проверка токена Google Id при каждом вызове на стороне лямбда-выражения

Я всегда передаю id_token в качестве заголовка при вызовах клиента (веб-приложения и мобильные приложения).

«acceptableHds» — это список разрешенных доменов.

const oauth = new Auth.OAuth2(CLIENT_ID_WEB, CLIENT_SECRET);
    oauth.verifyIdToken(token, null, (err, ticket) => {
      if (err) {
        return reject(err);
      }
      const payload = ticket.getPayload();

      const tokenIsOK = payload &&
        payload.aud === CLIENT_ID &&
        new Date(payload.exp * 1000) > new Date() &&
        acceptableISSs.has(payload.iss) &&
        acceptableHds.has(payload.hd)

      return tokenIsOK ? resolve(payload.hd) : reject();
    });

Второй вариант — однократная проверка токена Google Id на стороне лямбда-выражения

Я начал этот альтернативный способ, но не закончил, потому что первые решения соответствовали моим потребностям, а вехи были близки (требуется пул удостоверений):

1) Отправьте id_token в лямбда-функцию и проверьте его в Google API (здесь вы можете проверить домен, используя приведенный выше код)

2) Вызовите cognitoidentity.getOpenIdTokenForDeveloperIdentity на стороне лямбда, используя id_token, поступающий из браузера.

3) На клиенте вызовите любую из функций Cognito или STS, например, acceptWebIdentity, AssumeRole, используя маркеры, возвращенные из getOpenIdToken.

function getCognitoToken(id_token) {
  var param = {
    IdentityPoolId: 'us-east-1:f7b3d55f-6b63-4097-be8f-3dc22ddec1a4',
    Logins: { 'accounts.google.com': id_token }
  }
  return check_company(id_token).then(function (valid) {
    return cognitoidentity.getOpenIdTokenForDeveloperIdentity(param).promise()
  })

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

Третий вариант – поставщик SAML

Вы можете создать поставщика SAML и использовать утверждения SAML для проверки домена пользователя.

http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_assertions.html

Я с треском провалился, пытаясь это сделать.

P.S. Google Admin позволяет создавать частные приложения, ограничивая домены вашей компании, но, насколько мне известно, работает только для мобильных устройств.

https://support.google.com/a/answer/2494992?hl=ru

Надеюсь, это поможет кому-то!

person Carlos Alberto Schneider    schedule 08.05.2017