从Rails验证/验证AWS Cognito访问令牌

时间:2017-05-08 19:52:55

标签: ruby-on-rails ruby amazon-web-services amazon-cognito aws-cognito

我正在使用React Native构建移动应用。借助此库https://github.com/AirLabsTeam/react-native-aws-cognito-js,我可以通过应用注册和登录用户,Cognito会向应用返回访问令牌。

现在,应用程序将使用此令牌向Rails后端进行api调用。 (对于每个api电话。)

1)Rails如何验证令牌是否良好?

2)我如何才能收到用户的电子邮件?

3)AWS是否有api端点?

4)那里有一个类似的例子吗?

由于

3 个答案:

答案 0 :(得分:2)

无需转换为pem,红宝石宝石'jwt'可以解决问题:

aws_idp = Faraday.get('https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json').body
jwt_config = JSON.parse(aws_idp, symbolize_names: true)
JWT.decode(token, nil, true, {jwks: jwt_config, algorithms: ['RS256'] })

发送到服务器的令牌是您可以从放大JS库获取的id令牌:

cognitoUser.signInUserSession.idToken.jwtToken

如果解码无例外地通过,则令牌被验证 确保检查idp中的算法是否确实是RS256

答案 1 :(得分:1)

我可能已经找到了一种方法来做到这一点。

1)将其添加到您的Gemfile:

gem 'aws-sdk', '~> 2'

2)添加这3个env变量:

export AWS_REGION=us-west-2   
export AWS_ACCESS_KEY_ID="Your AWS Access Key ID"   
export AWS_SECRET_ACCESS_KEY= "Your AWS Secret Access Key"

3)创建一个新文件。我将以下内容放在app / modules / Aws.rb

require 'aws-sdk'

cognitoidentityprovider = Aws::CognitoIdentityProvider::Client.new(region: ENV['AWS_REGION'])

begin
  cognito_user = cognitoidentityprovider.get_user({
    access_token: "Token coming from the APP"
  })

  email_verified = cognito_user.user_attributes
                               .detect{ |attribute_type| attribute_type["name"] === "email_verified" && attribute_type["value"] === "true" }

  if email_verified.nil?
    raise "Email is not verified"
  else
    puts "EMAIL IS GOOD!" 
    puts cognito_user.username
  end

rescue StandardError => msg
  puts "ERROR!"
  puts msg
end

我可以在用irb。

进行测试时返回用户电子邮件

不确定这是否是用于向用户发送电子邮件的正确方式(或AWS方式)....我感谢任何评论或反馈...

答案 2 :(得分:1)

我不是Ruby或AWS专家...

但是,验证从Cognito获得的访问令牌应该很简单    验证JWT令牌。

JWT令牌是自我验证的。这意味着您不必与AWS Cognito服务进行联系即可验证此访问令牌是否正确。 在这一点上,您的想法可能被震撼了……(我的是)!但是,JWT(JSON Web令牌)目前是一个完善的规范,并且那里有一些非常好的资源,可以帮助您了解如何使用它们。

a link是帮助我的一些YouTube资源。

一旦您观看了视频观看this one,就可以很好地了解使用公钥和私钥进行加密/解密的过程。

此处another link是有关如何执行此操作的AWS官方文档。

TLDR

您使用链接中提供的公钥(给定用户池信息)

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
和用于ruby的标准jwt令牌库来验证访问令牌。

以下是Amazon文档中为nodejs给出的示例:

var jwt = require('jsonwebtoken');
var jwkToPem = require('jwk-to-pem');
var pem = jwkToPem(jwk);
jwt.verify(token, pem, { algorithms: ['RS256'] }, function(err, decodedToken) {
});