Для стратегии открытого и закрытого ключа RS256 вы можете использовать Ruby OpenSSL lib:
Генерация ключей:
key = OpenSSL::PKey::RSA.new 2048
open 'private_key.pem', 'w' do |io| io.write key.to_pem end
open 'public_key.pem', 'w' do |io| io.write key.public_key.to_pem end
Загрузите ключ из файла .pem для подписи токена:
priv_key = OpenSSL::PKey::RSA.new File.read 'private_key.pem'
token = JWT.encode payload, priv_key, 'RS256'
Загрузите ключ из файла .pem в токен Verify (создайте для этого промежуточное ПО):
begin
# env.fetch gets http header
bearer = env.fetch('HTTP_AUTHORIZATION').slice(7..-1)
pub_key = OpenSSL::PKey::RSA.new File.read 'public_key.pem'
payload = JWT.decode bearer, pub_key, true, { algorithm: 'RS256'}
# access your payload here
@app.call env
rescue JWT::ExpiredSignature
[403, { 'Content-Type' => 'text/plain' }, ['The token has expired.']]
rescue JWT::DecodeError
[401, { 'Content-Type' => 'text/plain' }, ['A token must be passed.']]
rescue JWT::InvalidIssuerError
[403, { 'Content-Type' => 'text/plain' }, ['The token does not have a valid issuer.']]
rescue JWT::InvalidIatError
[403, { 'Content-Type' => 'text/plain' }, ['The token does not have a valid "issued at" time.']]
end
Чтобы использовать ключ RSA в .env
вместо загрузки файла, вам нужно будет использовать gem 'dotenv'
и импортировать ключ как однострочную переменную с использованием новой строки '\n'
. проверьте это ">вопрос о том, как это сделать. пример:
PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nmineminemineminemine\nmineminemineminemine\nmineminemine...\n-----END PUBLIC KEY-----\n"
в качестве переменной .env
PUBLIC_KEY
загрузка ключа изменится на это:
key = OpenSSL::PKey::RSA.new ENV['PUBLIC_KEY']
person
Marcelo Fonseca
schedule
31.01.2019