我正在使用React Native构建移动应用。借助此库https://github.com/AirLabsTeam/react-native-aws-cognito-js,我可以通过应用注册和登录用户,Cognito会向应用返回访问令牌。
现在,应用程序将使用此令牌向Rails后端进行api调用。 (对于每个api电话。)
1)Rails如何验证令牌是否良好?
2)我如何才能收到用户的电子邮件?
3)AWS是否有api端点?
4)那里有一个类似的例子吗?
由于
答案 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) {
});