Проверка / проверка токена доступа AWS Cognito из Rails

Я создаю мобильное приложение с React Native. С помощью этой библиотеки https://github.com/AirLabsTeam/react-native-aws-cognito-js, я могу зарегистрироваться и войти в систему через приложение, и Cognito вернет в приложение токен доступа.

Теперь приложение будет вызывать api-вызовы бэкэнда Rails с этим токеном. (для каждого вызова API.)

1) Как сторона Rails может проверить, исправен токен или нет?

2) Как я могу получить электронную почту пользователя?

3) Есть ли конечная точка api от AWS?

4) Есть ли подобный пример?

Спасибо


person Gundam Meister    schedule 08.05.2017    source источник


Ответы (3)


Нет необходимости конвертировать в 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'] })

Токен, отправленный на сервер, - это токен id, который вы можете получить из расширения JS lib:

cognitoUser.signInUserSession.idToken.jwtToken

Если декодирование проходит без исключения, токен проверен. Убедитесь, что вы проверили, действительно ли алгоритм в idp является RS256.

person Ben    schedule 02.08.2020

Возможно, я нашел способ сделать это.

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) для получения электронной почты пользователя .... Буду признателен за любые комментарии или отзывы ...

person Gundam Meister    schedule 29.05.2017

Я не эксперт по Ruby или AWS ...

Но проверка токена доступа, полученного от Cognito, должна быть такой же простой, как проверка токена JWT.

Токены JWT проходят самопроверку. Это означает, что вам не нужно связываться со службой AWS Cognito, чтобы проверить правильность этого токена доступа. В этот момент ваш разум, вероятно, взорван ... (Мой был)! Но JWT (JSON Web Tokens) на данный момент является хорошо зарекомендовавшей себя спецификацией, и есть несколько очень хороших ресурсов, чтобы понять, как их использовать.

Вот ссылка на некоторые ресурсы YouTube, которые мне помогли.

После просмотра этого видео посмотрите этот, чтобы увидеть хороший пример шифрования / дешифрования. процесс с открытыми и закрытыми ключами.

Вот еще одна ссылка на официальную документацию AWS о том, как это сделать.

TL; DR

You validate the access token using the public key available from the link (given your user pool information)

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
and a standard jwt token library for ruby.

Вот пример, приведенный для nodejs в документации Amazon:

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