【发布时间】:2022-10-07 20:42:57
【问题描述】:
我有两个共享数据库并使用 Devise 进行身份验证的 Rails 应用程序。其中之一是纯粹的 API。我希望能够从一个应用程序向另一个应用程序(API)发出请求,并能够验证User。
我尝试过使用 JWT,但签名不断被标记。
我可以通过 encrypted_password 但我不知道如何在其他应用程序上验证它。
我觉得我错过了一些简单的东西。
【问题讨论】:
标签: ruby-on-rails
我有两个共享数据库并使用 Devise 进行身份验证的 Rails 应用程序。其中之一是纯粹的 API。我希望能够从一个应用程序向另一个应用程序(API)发出请求,并能够验证User。
我尝试过使用 JWT,但签名不断被标记。
我可以通过 encrypted_password 但我不知道如何在其他应用程序上验证它。
我觉得我错过了一些简单的东西。
【问题讨论】:
标签: ruby-on-rails
如果数据库在应用程序之间共享,您可以简单地通过 Devise :database_authenticable 在仅 api 应用程序上对用户进行身份验证。但是为什么要与 2 个应用程序共享同一个数据库?
您可以使用Devise-Jwt gem 在第一个应用程序上生成 JWT,然后将其与每个请求一起传递给第二个应用程序并进行验证。显然,JWT 的加密密钥在两个应用程序上必须相同。
【讨论】:
我最终使用以下解决方案解决了这个问题。我知道这可能不被推荐或非常安全,但对于我的需求和下游影响它工作得很好:
应用程序 1:
def generate_encryption
pass_phrase = ENV['SHARED_SECRET']
salt = '8 octets'
encryptor = OpenSSL::Cipher.new 'AES-128-CBC'
encryptor.encrypt
encryptor.pkcs5_keyivgen pass_phrase, salt
encrypted = encryptor.update @user.email
encrypted << encryptor.final
return encrypted
end
应用程序 2(API):
def decode_encryption(encrypted)
pass_phrase = ENV['SHARED_SECRET']
salt = '8 octets'
decryptor = OpenSSL::Cipher.new 'AES-128-CBC'
decryptor.decrypt
decryptor.pkcs5_keyivgen pass_phrase, salt
plain = decryptor.update encrypted
plain << decryptor.final
return plain
end
然后我使用解密的消息找到User 并确保它们存在。
【讨论】: