使用Cognito和Devise对应用程序进行身份验证

时间:2019-03-22 01:56:09

标签: ruby-on-rails authentication devise amazon-cognito warden

我正在尝试在我的应用程序中实现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应用程序的映像。

Webapplication output once i complete the login form.

对此的任何帮助都会令人惊奇。

先谢谢了。

2 个答案:

答案 0 :(得分:0)

一种解决方案是,当您在Cognito用户池中创建应用程序客户端时,取消选中用于生成客户端密钥的选项。默认情况下,此选项为选中状态,您必须知道取消选中(https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-client-apps.html)。

  

默认情况下,用户池会为您的应用生成一个客户端机密。如果您不希望发生这种情况,请清除“生成客户端密码”。

只能在创建新客户端期间取消选中客户端机密,因此您可能必须删除客户端应用程序并创建一个新应用程序(没什么大不了的。)

我还在中型文章https://medium.com/@morgler/beta-learnings-from-developing-vuejs-quasar-aws-amplify-and-cognito-application-dd38ec58b881

中收集了有关Cognito,Devise,Rails和VueJS的知识。

答案 1 :(得分:0)

由于没有正确配置适用于Ruby的AWS开发工具包,因此出现此错误。该错误不仅可能存在于Cognito API,而且可能存在于任何AWS Signature V4签名API调用。请参考此documentation,为您的应用正确配置SDK。