У меня есть приложение 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()
...