gpt4 book ai didi

ruby - Grape API 和 HTTP 摘要认证

转载 作者:数据小太阳 更新时间:2023-10-29 08:49:48 45 4
gpt4 key购买 nike

我正在为我的 ruby​​ 应用程序创建一个 API,它基于 HTTP 摘要身份验证对用户进行身份验证。我决定使用 Grape API 库,因为它可以在 ruby​​ 中创建一个更干净的 API。 Grape 文档指出您可以像这样使用摘要式身份验证:

http_digest({ :realm => 'Test Api', :opaque => 'app secret' }) do |username|
# lookup the user's password here
{ 'user1' => 'password1' }[username]
end

上面的 Grape 实现是 Rack::Auth::Digest::MD5 的包装器

现在也是出于安全考虑,我读到从 RFC 2617 开始,您不需要将密码作为纯文本存储在数据库中,您可以存储用户名的 MD5 摘要:realm:password 并对其进行身份验证,所以我创建了一个 DataMapper型号:

class Key
include DataMapper::Resource

property :id, Serial

property :username, String
property :password, String

property :active, Boolean, :default => true
property :created_at, DateTime, :default => DateTime.now
property :updated_at, DateTime
end

现在有了我提供的内容,我不知道如何连接这两者并使其发挥作用。

最佳答案

不幸的是,Rack::Auth::Digest::MD5 需要服务器端的明文密码。

Grape 示例代码显示了密码的硬编码查找。

您可以将 { 'user1' => 'password1' }[username] 替换为

Key.first( :username => username ).password

假设您在 Key 类中存储了明文 密码。我想你可以存储这些可逆加密的,尽管这不会增加太多安全性,除非你构建相对复杂/昂贵的 key 管理方案。

不确定是否有一种方法可以让您存储散列密码。 MD5 不是最安全的散列选择(尽管总比没有好!)。如果安全性是您的 API 的一个重要问题,您将希望超越摘要身份验证 - 例如,使用 https 会有所帮助。

编辑:经过反复的讨论,Grape 示例的以下变体确实允许您存储 MD5 密码:

auth :http_digest, { :realm => { :realm => 'Llama', :passwords_hashed => true, :opaque => "7302c32d39bbacb5ed0ace096723fd" } } do |username|
Digest::MD5.hexdigest( 'fred:Llama:654321' )
end

该示例给出了一个硬编码的用户名:'fred',密码:'654321' 响应。所以我认为你的目标代码是这样的:

auth :http_digest, { :realm => { :realm => 'Llama', :passwords_hashed => true, :opaque => "7302c32d39bbacb5ed0ace096723fd" } } do |username|
k = Key.first( :username => username )
k ? k.password : nil
end

然后将 Digest::MD5.hexdigest( "#{username}:#{realm}:#{password}") 的结果存储在每个用户的密码属性中。

注意两次 :realm 的双层哈希。这有点 hacky,但至少你不必编写自己的中间件,Grape 仍在处理它。这不是 Grape 的文档化功能或包含在测试中,因此可能在未来的版本中不起作用。

关于ruby - Grape API 和 HTTP 摘要认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15822593/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com