ユーザープール(ユーザー名とパスワード)を備えたモバイルアプリがあります。アプリはaws-amplify SDKで正常に動作します。しかし、コードをLambdasに移動したかったのです。そのため、Boto3を使用して次のLambdaを作成しました。
こちらがラムダです:
import boto3
def lambda_handler(event, context):
client = boto3.client('cognito-idp')
response = client.initiate_auth(
ClientId='xxxxxxxxxxxxxx',
AuthFlow='USER_PASSWORD_AUTH',
AuthParameters={
'USERNAME': 'xxxxxx',
'PASSWORD': 'xxxxxx'
}
)
return response
Admin_initiate_authも試しました。
import boto3
def lambda_handler(event, context):
client = boto3.client('cognito-idp')
response = client.initiate_auth(
UserPoolId='xxxxxxxxx',
ClientId='xxxxxxxxxxxxxx',
AuthFlow='USER_PASSWORD_AUTH',
AuthParameters={
'USERNAME': 'xxxxxx',
'PASSWORD': 'xxxxxx'
}
)
return response
ここに私が得るエラーがあります。
InitiateAuth操作を呼び出すときにエラー(InvalidParameterException)が発生しました:USER_PASSWORD_AUTHフローがこのクライアントに対して有効になっていません:InvalidParameterExceptionトレースバック(最後の最後の呼び出し):
ファイル "/var/task/lambda_function.py"、12行目、lambda_handler 'PASSWORD': 'xxxxx'ファイル" /var/runtime/botocore/client.py "、行317、_api_call return self ._make_api_call(operation_name、kwargs)File "/var/runtime/botocore/client.py"、行615、_make_api_call raise error_class(parsed_response、operation_name)InvalidParameterException:InitiateAuth操作を呼び出すときにエラーが発生しました(InvalidParameterException)。このクライアントに対して有効
何かご意見は?
それを考え出した。 gotoユーザープール->アプリクライアント->詳細の表示->アプリベース認証(USER_PASSWORD_AUTH)のユーザー名-パスワード(非SRP)フローを有効にします。
それはそれを修正しました。
AuthFlowがExplicitAuthFlowsをパスするにもかかわらず、動作するはずです。 `
import boto3
def lambda_handler(event, context):
client = boto3.client('cognito-idp')
response = client.initiate_auth(
UserPoolId='xxxxxxxxx',
ClientId='xxxxxxxxxxxxxx',
ExplicitAuthFlows='USER_PASSWORD_AUTH',
AuthParameters={
'USERNAME': 'xxxxxx',
'PASSWORD': 'xxxxxx'
}
)
return response
`
私にとって、資格情報は誰かに役立つ場合に備えて、ここでhmacが必要であることがわかりました。
import boto3
import boto3.session
import hmac, base64, hashlib
from botocore.client import ClientMeta
class AwsAuth(object):
'''
classdocs
'''
def gettoken(self):
if self.token:
return self.token
else:
return False
def connect(self):
if not self.username:
self.username = raw_input("Username: ")
if not self.password:
self.password = raw_input("Password: ")
digest = self.gethmacdigest(self.username)
response = self.client.initiate_auth(
ClientId=self.clientid,
AuthFlow='USER_PASSWORD_AUTH',
AuthParameters={
'USERNAME': self.username,
'PASSWORD': self.password,
'SECRET_HASH': digest
},
ClientMetadata={
'UserPoolId': self.userpoolid
}
)
self.token = response
return response
def gethmacdigest(self, username):
message = username + self.clientid
Dig = hmac.new(self.clientsecret, msg=message.encode('UTF-8'), digestmod=hashlib.sha256).digest()
return base64.b64encode(Dig).decode()
def __init__(self, path, url, fileout, filein, userpoolid, clientid, clientsecret, region, username = None, password = None):
'''
Constructor
'''
#boto3.set_stream_logger('botocore', level="DEBUG")
self.path = path
self.url = url
self.fileout = fileout
self.filein = filein
self.userpoolid = userpoolid
self.clientid = clientid
self.clientsecret = clientsecret
self.region = region
self.token = ""
boto3.setup_default_session(region_name=region)
self.client = boto3.client('cognito-idp')
if username is not None:
self.username = username
else:
self.username = None
if password is not None:
self.password = password
else:
self.password = None