当Mechanize看到糟糕的OAuth凭证时,为什么提出“未定义的方法”?

时间:2012-10-04 05:29:36

标签: ruby oauth oauth-2.0 mechanize mechanize-ruby

我正在测试一些使用Mechanize的Ruby代码。我发现当我在请求中传递错误的OAuth令牌时,Mechanize会抛出意外的异常。

我使用错误令牌进行调用,并且调用引发以下异常:

#<NoMethodError: undefined method `any?' for nil:NilClass>

我有一些额外的分析,我会将其作为答案发布,但如果有人有其他见解,我们将不胜感激。

我尝试将此问题放在mechanize-users邮件列表中,但主持人没有发布。

2 个答案:

答案 0 :(得分:1)

如果你看here你可以看到比Mechanize :: HTTP :: WWWAuthenticateParser #parse在某些情况下可以返回nil(截至本文第83行)我不知道为什么这可能有用但是有你的答案。

答案 1 :(得分:0)

初始响应包含带有错误信息的WWW-AUTHENTICATE标头:

response-header: www-authenticate => Bearer realm=api.att.com,error=invalid_token, error_description=the token is not valid

从我对the OAuth spec的阅读中,这是正确的用法。但是,通过Mechanize代码进行跟踪,我发现Mechanize假定WWW-AUTHENTICATE标头将包含一个或多个挑战,描述如何通过身份验证重试请求。我特意发现自己在#response_authenticate中的agent.rb:702,在​​那里它检查凭据:

@auth_store.credentials?

那个方法反过来调用#any?在一个零对象上,因为它无法解析标题中的任何挑战:

def credentials? uri, challenges
    challenges.any? do |challenge|
        credentials_for uri, challenge.realm_name
    end
end