Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何验证从一个Rails应用发送到另一个Rails应用的请求_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何验证从一个Rails应用发送到另一个Rails应用的请求

Ruby on rails 如何验证从一个Rails应用发送到另一个Rails应用的请求,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有2个rails应用程序 App1需要发送将由App2保存的数据 我想知道创建安全API端点的最佳方法 如何验证App1发送给App2的请求 我曾经使用过其他需要验证请求的API,比如Facebook 通过Facebook,他们在标题中发送一个令牌,我可以计算并比较该令牌来验证请求 def verify_webhook(request) sha1 = request.headers["X-Hub-Signature"].gsub("sha1=", "") digest = O

我有2个rails应用程序

App1需要发送将由App2保存的数据

我想知道创建安全API端点的最佳方法

如何验证App1发送给App2的请求

我曾经使用过其他需要验证请求的API,比如Facebook

通过Facebook,他们在标题中发送一个令牌,我可以计算并比较该令牌来验证请求

def verify_webhook(request)

    sha1 = request.headers["X-Hub-Signature"].gsub("sha1=", "")
    digest = OpenSSL::Digest.new('sha1')
    request.body.rewind
    data = request.body.read

    # Calculate a sha1 with the app key and payload from the post request
    calculated_hmac = OpenSSL::HMAC.hexdigest(digest, ENV['FB_APP_SECRET'], data)

    # Computate hmac and see if verified is true
    verified = ActiveSupport::SecurityUtils.secure_compare(calculated_hmac, sha1)

    verified
end
我假设解决方案是类似的,但我找不到我试图在网上做什么的文档,我不太熟悉这些术语,所以我可能搜索了错误的东西


有人能给我指出正确的方向吗?

在设计安全相关功能时,您应该首先建立一个威胁模型。这包括全面了解攻击面-您的应用程序是通过internet通信还是仅通过公司网络通信并假设谁会试图破坏您的应用程序,以及他们愿意并能够为此投入多少精力

对于低威胁环境,如@max的评论所述,在HTTP头中传输一个预共享密钥/机密就足够了:您只需为两个应用程序提供一个密钥,并在每次调用时在HTTP头中发送密钥-当然,这应该通过TLS加密连接进行

如果您的威胁模型中包含一名攻击者,该攻击者可能能够破坏TLS加密连接并从中获取预先共享的秘密,您可以将其提升一个级别,而不是在头中传输密钥本身,通过HMAC创建校验和并在客户端上对其进行比较,就像您的示例中使用Facebook SDK一样。您可能还希望添加加密nonce以避免重播攻击


最后,,在设计与安全相关的代码时,您可能希望有安全方面的经验的人对其进行审查,因为很容易出错并使您的所有努力付诸东流。

最简单的方法是,如果委托是服务器到服务器,则发送一个包含两个应用程序都知道的共享机密的头,你可以将秘密存储在Rails 5加密凭据中。如果你需要一种更复杂的方法,应用程序1的用户需要在应用程序2上进行身份验证,你可以使用它来创建自己的OAuth服务。这与使用FB或任何其他oauth提供者非常相似。您发送一个带有用户凭据的请求,您的应用程序id Doorkeeper提供一个用于注册应用程序的GUI和一个秘密,并作为回报获得一个访问令牌。