在 authenticate_or_request_with_http_digest 中获取密码

Posted

技术标签:

【中文标题】在 authenticate_or_request_with_http_digest 中获取密码【英文标题】:Get password inside authenticate_or_request_with_http_digest 【发布时间】:2011-06-15 13:19:17 【问题描述】:

我有一个应用程序连接到一个 iphone 应用程序,该应用程序又通过 http_digest 对其用户进行身份验证。

我正在使用 authlogic,在我的架构中,网站的用户是“用户”,而手机应用程序的用户是“人”。所以,我有 user_sessions 和 people_sessions。为了处理 http_digest 身份验证,我使用如下的 authenticate_or_request_with_http_digest 方法:

def digest_authenticate_person
  authenticate_or_request_with_http_digest do |email, password|
    #ldb is just a logging method i have
    ldb "email = #email.inspect, password = #password.inspect"
    person = Person.find_by_email(email)
    if person
      ldb "Authentication successful: Got person with id #person.id"
      @current_person_session = PersonSession.create(person)        
    else
      ldb "Authentication failed"
      @current_person_session = nil
    end
    return @current_person_session
  end
end

我可以在日志中看到密码为零:只有电子邮件被传递到 authenticate_or_request_with_http_digest 块的内部。

我正在用这样的 curl 调用来测试它:

curl --digest --user fakename@madeup.xyz:apass "http://localhost:3000/reports.xml"

我希望“fakename@madeup.xyz”和“apass”能够传递到块的内部。一旦我有了密码,我就可以使用电子邮件和密码的组合以正常方式查找(或不查找)用户。有谁知道我也可以访问密码吗?

感谢任何建议 - 最大

编辑 - 在进一步的谷歌搜索中,我认为我使用这种方法是错误的:我应该只返回密码或加密密码。但是,我如何将它与作为 http_digest 用户名的一部分传递的密码进行比较?

【问题讨论】:

把用户参数放在引号里怎么办? --user 'fakename@madeup.xyz:apass' @Douglas - 试过了,没什么区别。但是谢谢:) 【参考方案1】:

找到了答案:我对 authenticate_or_request_with_http_digest 的工作原理有一个根本的误解:在阅读了文档(在 gem 的源代码中)之后,我意识到这种方法的目的是不是身份验证,其目的是向浏览器提供“email:realm:password”字符串,让浏览器对其进行加密,并根据它自己计算的(或缓存的)版本检查结果。

我是这样设置的:

def current_person
  if @current_person
    @current_person
  else
    load_current_person
  end
end 

#use in before_filter for methods that require an authenticated person (mobile app user)
def require_person
  unless current_person
    redirect_to root_path
  end   
end

def load_current_person
  #check user agent to see if we're getting the request from the mobile app
  if request.env['HTTP_USER_AGENT'] =~ /MobileAppName/
    result = digest_authenticate_person
    if result == 401
      return 401
    elsif result == true
      #make authlogic session for person
      @current_person_session = PersonSession.new(@person_from_digest_auth)
      @current_person = @person_from_digest_auth
    end
  end
end  

#this method returns either true or 401
def digest_authenticate_person
  authenticate_or_request_with_http_digest(Person::DIGEST_REALM) do |email|
    person = Person.find_by_email(email)
    @result = nil
    if person
      #need to send back ha1_password for digest_auth, but also hang on to the person in case we *do* auth them successfully
      @person_from_digest_auth = person
      @result = person.ha1_password  
    else
      @person_from_digest_auth = nil
      @result = false
    end
    @result
  end
end

【讨论】:

以上是关于在 authenticate_or_request_with_http_digest 中获取密码的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据