【问题标题】:Obtaining an OAuth token in ruby (for the Mendeley API)在 ruby​​ 中获取 OAuth 令牌(用于 Mendeley API)
【发布时间】:2026-02-13 18:05:01
【问题描述】:

我似乎无法弄清楚对 Mendeley 的 authenticated API 的调用的 OAuth 身份验证(请注意,公共方法 here 有一个未维护的?gem)。

我在他们的门户网站上创建了一个应用程序,该应用程序返回一个应用程序使用者密钥和使用者密码。我将它们弹出到一个 YAML 文件中,然后我可以在我的 Ruby 脚本中读取该文件。

  cred = YAML.load_file("/home/cboettig/.mendeley_auth.yaml")
  key = cred[:consumer_key] 
  secret = cred[:consumer_secret]

尝试方法一

似乎有一个nice example of authenticated call to the Mendeley API using the Faraday gem for authentication here。不幸的是,它似乎没有记录如何在最后的实际调用中获取令牌(或者它是哪个令牌?)。 (它指向一个 github gist,将令牌生成为密钥的 SHA1 哈希,但我找不到使该工作正常的库依赖项,鉴于已经可用于处理 OAuth 的工具数量,它似乎过于复杂...... .) 这是我对方法 1 的了解:

  ## Method 1 -- how do I get the token?
  key = cred[:key] 
  secret = cred[:secret] 
  token = ???? # How to get the token? 
  mendeley = Mendeley.new(token, secret) # Needs a token
  profile = mendeley.get('/oapi/profiles/info/me') # example API call

尝试方法二

关于这个主题有一个现有的 SO 问题,Mendeley Custom OAuth Strategy,我也未能成功关注。它表明这可以使用Omniauth 来处理,并且看起来这已经在omniauth-mendeley gem 中实现了。不幸的是,我无法确定the limited documentation 的正面或反面,这暗示了这样的事情:

 ## Method 2 -- 
 require 'omniauth-mendeley'
  use OmniAuth::Builder do
    provider :mendeley, ENV[key], ENV[secret]
  end

好的,我可以得到密钥和秘密,但是我的 ruby​​-fu 非常有限,我看不懂上面的语法。如何执行此操作,然后对 API 进行函数调用(例如方法 1 尝试中显示的对 profile/me 的调用?尝试运行它只会让我出错

 undefined method `use' for main:Object

有什么提示可以让这两种方法发挥作用吗?

【问题讨论】:

标签: ruby api oauth mendeley


【解决方案1】:

感谢您在 shazino 博客中提及我的文章。

OAuth 主要用于网络。
它需要在进行身份验证的两个网站之间进行互动。
这就是为什么您在网络之外找不到任何示例来获取令牌的原因。

在我目前的使用中,我们有一个 iOS 应用程序正在检索令牌(我们为此开发了 MendeleySDK)。
它将它提供给我们的服务器,因此我们可以代表用户进行一些 API 调用。
这就是我不需要进行 OAuth 舞蹈的原因。

您的方法 2 是可行的方法。 OmniAuth::Builderrack middleware。它的语法用于config.ru 文件。

尝试创建此文件并将您在示例 2 中演示的代码放在那里。
然后,在您的终端中转到文件的文件夹并输入rackup
您需要先安装 rack gem。
这应该使用您需要的中间件在端口 9292 上启动一个 Web 服务器。
有关使用 OmniAuth 中间件的更多信息,请查看their wiki

【讨论】:

  • 感谢您的回答。实际上,我确实通过 rails/rack 上下文之外的各种其他 ruby​​ gem 使用 OAuth——我的网站建立在流行的 jekyll ruby​​ 平台上,该平台提前构建了一个静态站点。例如我写了this script 来通过 twitter oauth 做类似的事情,但在这种情况下,Twitter 在注册应用程序时提供了令牌。我可以很好地在 IRB 中运行该函数的内容。只是无法弄清楚门德利案。