我正在尝试在我的应用程序中实现AWS Cognito,以实现更好的全面身份验证。该系统是一个Rails应用程序,当前正在使用Warden / Devise作为处理用户帐户(登录,注册)的方法。
我的目标是拥有一个AWS UserPool,其中包含该应用程序的用户列表。使用Cognito验证用户后,我希望搜索我们当前用于该角色的表,并根据他们所分配的角色将用户移动到系统的正确区域。
我已经开始实现处理此问题的逻辑,但是遇到了障碍。
请在下面查看我的代码。
cognito_authenticatable.rb
用于处理认知身份验证的逻辑。我在这里要做的就是检查用户是否注册并返回有效令牌,以便我更喜欢内部应用程序检查来收集用户角色。
def authenticate!
if params[:login]
region_name = 'us-east-2'
user_pool_id = 'us-east-2_Qj78BNQon'
client_id = '1pv3eno72e51mll3q36cuiojmr'
client = Aws::CognitoIdentityProvider::Client.new(
region: region_name
)
resp = client.initiate_auth({
client_id: client_id,
auth_flow: "USER_PASSWORD_AUTH",
auth_parameters: {
"USERNAME" => email,
"PASSWORD" => password
}
})
end
end
divise.rb
此代码只是将新的身份验证策略添加到应用程序监护服务中。
config.warden do |manager|
manager.strategies.add(:cognito,
Devise::Strategies::CognitoAuthenticatable)
manager.default_strategies(:scope => :login).unshift :cognito
manager.default_strategies(:scope => :login).pop
end
控制台中的输出错误为
Aws :: Errors :: MissingCredentialsError(无法在未设置凭据的情况下签署请求):
config / initializers / cognito_authenticatable.rb:23:in'authenticate!'
,这是来自正在运行的localhost应用程序的映像。
对此的任何帮助都会令人惊奇。
先谢谢了。
答案 0 :(得分:0)
一种解决方案是,当您在Cognito用户池中创建应用程序客户端时,取消选中用于生成客户端密钥的选项。默认情况下,此选项为选中状态,您必须知道取消选中(https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-client-apps.html)。
默认情况下,用户池会为您的应用生成一个客户端机密。如果您不希望发生这种情况,请清除“生成客户端密码”。
只能在创建新客户端期间取消选中客户端机密,因此您可能必须删除客户端应用程序并创建一个新应用程序(没什么大不了的。)
中收集了有关Cognito,Devise,Rails和VueJS的知识。答案 1 :(得分:0)
由于没有正确配置适用于Ruby的AWS开发工具包,因此出现此错误。该错误不仅可能存在于Cognito API,而且可能存在于任何AWS Signature V4签名API调用。请参考此documentation,为您的应用正确配置SDK。