【问题标题】:Authenticate User across 2 different Rails apps with Devise使用 Devise 在 2 个不同的 Rails 应用程序中验证用户
【发布时间】:2022-10-07 20:42:57
【问题描述】:

我有两个共享数据库并使用 Devise 进行身份验证的 Rails 应用程序。其中之一是纯粹的 API。我希望能够从一个应用程序向另一个应用程序(API)发出请求,并能够验证User

我尝试过使用 JWT,但签名不断被标记。 我可以通过 encrypted_password 但我不知道如何在其他应用程序上验证它。

我觉得我错过了一些简单的东西。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    如果数据库在应用程序之间共享,您可以简单地通过 Devise :database_authenticable 在仅 api 应用程序上对用户进行身份验证。但是为什么要与 2 个应用程序共享同一个数据库?

    您可以使用Devise-Jwt gem 在第一个应用程序上生成 JWT,然后将其与每个请求一起传递给第二个应用程序并进行验证。显然,JWT 的加密密钥在两个应用程序上必须相同。

    【讨论】:

    • 我试图创建自己唯一的 JWT 并使用相同的加密密钥,但它不起作用。声称签名不一样。
    • 分享有关您的实施的更多详细信息
    【解决方案2】:

    我最终使用以下解决方案解决了这个问题。我知道这可能不被推荐或非常安全,但对于我的需求和下游影响它工作得很好:

    应用程序 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 并确保它们存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 2012-02-08
      • 1970-01-01
      • 2017-03-29
      相关资源
      最近更新 更多