Создайте сеанс boto3 с использованием учетных данных Cognito, сохраняя конфиденциальность - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть приложение React, которое подключается к сервисам AWS Cognito, позволяя пользователям создавать учетные записи.Затем я хочу, чтобы аппаратные устройства, работающие на чистом python, могли хранить учетные данные, позволяющие ему подключаться к AWS от имени того же пользователя cognito, с максимально возможной конфиденциальностью (надеюсь, избегая хранения простого имени пользователя и пароля)).

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

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

Я надеюсь, что смогу обработать поток как Roomba или Amazon Echo (?)

1) The device boots
2) you login to amazon/iRobot
3) App forces you to connect over WiFi to device
4) Store some credentials on the device to make it functional
5) Return back to normal Wifi
6) Device continues to work.
def get_identity_id():
    return 'us-west-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx'

def get_boto_credentials(username, password):

    # static
    user_pool_id = 'us-west-2_xxxxxxxxx'
    client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
    region = 'us-west-2'

    # user specific / sanitize this
    identity_id = get_identity_id()

    def get_credentials(id_token):
        import boto3

        ci_client = boto3.client('cognito-identity', region_name=region)
        provider_name = 'cognito-idp.%s.amazonaws.com/%s' % (
                region, user_pool_id)

        credentials = ci_client.get_credentials_for_identity(
                IdentityId=identity_id,
                Logins={provider_name: id_token},
        )

        if not credentials or not credentials.get('Credentials'):
            return None

        credentials = credentials.get('Credentials')

        keys_token = {}
        keys_token['access_key_id'] = credentials.get('AccessKeyId')
        keys_token['secret_access_key'] = credentials.get('SecretKey')
        keys_token['session_token'] = credentials.get('SessionToken')

        return keys_token

    def get_id_token(_username, _password):
        from warrant import Cognito

        u = Cognito(user_pool_id, client_id,
            username=_username, user_pool_region=region)

        try:
            u.authenticate(password=_password)
        except:
            raise

        return u.id_token

    id_token = get_id_token(username, password)
    return get_credentials(id_token)

def get_s3_resource():
    import boto3

    username = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    password = 'passw0rd'

    identity_id = tools.get_identity_id()
    creds = tools.get_boto_credentials(username, password)

    session = boto3.Session(
            region_name='us-west-2',
            aws_access_key_id=creds['access_key_id'],
            aws_secret_access_key=creds['secret_access_key'],
            aws_session_token=creds['session_token'])

    return session.resource('s3')

s3 = get_s3_resource()
...
...