1

我正在使用 ruby​​-box gem 连接到 box.com,它声明使用此代码获取访问令牌:

session = RubyBox::Session.new({
  client_id: $boxClientID,
  client_secret: $boxClientSecret
})

authorize_url = session.authorize_url('https://redirect-url-in-app-settings')

@token = session.get_access_token('code-returned-to-redirect_url')

问题是我没有要重定向的 url,而且我也没有使用 GUI,所以我无法从那里获取代码。我该怎么办?

4

3 回答 3

3

Ben 在这里,我是 ruby​​-box Gem 的开发者之一。以下是您可以执行的操作:

  • 在 app.box.com 设置您的应用程序以使用此回调

https://localhost/oauth2callback

  • 在 IRB 中,使用相同的回调生成一个授权 url:
    会话 = RubyBox::Session.new({
      client_id: $boxClientID,
      client_secret: $boxClientSecret
    })

    authorize_url = session.authorize_url('https://localhost/oauth2callback')

  • 将此 URL 粘贴到网络浏览器中。
  • 使用 Box 进行身份验证后,您最终会进入一个回调页面,其 URL 如下所示:

https://localhost/oauth2callback?state=&code=OQpfImZH35Ab9weUy61kthIvqZ2Dyz6

  • 复制代码的值。
  • 回到 irb,运行以下命令:

token = session.get_access_token('OQpfImZH35Ab9weUy61kthIvqZ2Dyz6')
access_token = token.token
refresh_token = token.refresh_token

  • 将访问令牌和刷新令牌存储在数据库中(或餐巾纸上,或任何您认为合适的地方)。
  • 从现在开始,您可以像这样实例化会话:

    session = RubyBox::Session.new({
      access_token: $storedAccessTokenValue,
      refresh_token: $storedRefreshTokenValue,
      client_id: $boxClientID,
      client_secret: $boxClientSecret
    })

    client = RubyBox::Client.new(session)

您只需为用户获取一次 access_token 和 refresh_token。

于 2013-08-06T01:46:27.023 回答
1

所以一个问题是访问和刷新令牌过期 - 我认为您不能无限期地存储这些令牌并永远保持实例化 RubyBox 会话。如果您想要一些非常不安全的东西(从脚本将存储用户名和密码的角度来看)但确实有效,那么您可以使用 Mechanize 遍历 GUI 的交互部分。这是我今天写的一个脚本来解决同样的问题。请注意,您需要为 oauth2 提供一个重定向 URI,而我无法弄清楚如何让 Mechanize 幸存下来,给它一个完全无效的 URL。URI 必须是 https,所以我随机选择了https://www.chase.com 。该页面的内容无关紧要,重要的是身份验证代码附加到重定向的 URL,这就是我所需要的。

但同样,这完全违背了 oauth2 的全部意义,即在不泄露自己密码的情况下授予应用程序权限。所以谨慎使用...

此外,它确实依赖于 box.com 上授权表单中的表单结构和变量名称,我想这可能会随时更改,因此有点脆弱。

require 'ruby-box'
require 'mechanize'
require 'cgi'

# get as new box session
box_session = RubyBox::Session.new({
    client_id: 'your-client-id',
    client_secret: 'your-client-secret'
})

# Get the authorization URL from Box by specifying redirect URL
# as the arbitrary but working Chase bank home page
authorize_url = box_session.authorize_url('https://www.chase.com')

agent = Mechanize::new

# process the first login screen
login_page = agent.get(authorize_url)

# get the login form where you enter the username and password
login_form = login_page.form_with(name: 'login_form1')
login_form.login = 'your-box-username'
login_form.password = 'your-box-password'

# submit the form and get the allow/deny page back
allow_page = agent.submit(login_form)

# find the form that allows consent
consent_form = allow_page.form_with(name: 'consent_form')

# now find the button that submits the allow page with consent
accept_button = consent_form.button_with(name: 'consent_accept')

# Submit the form to cause the redirection with authentication code
redirpage = agent.submit(consent_form, accept_button)

# Use the CGI module to get a hash of the variables (stuff after ?)
# and then the authentication code is embedded in [" and "] so 
# strip those
code_query = CGI::parse(redirpage.uri.query)["code"].to_s
box_authentication_code = code_query[2,code_query.length-4]

# get the box access token using the authentication code
@token = box_session.get_access_token(box_authentication_code)

# print the tokens to show we have them
p @token.token 
p @token.refresh_token

# Create a new Box client based on the authenticated session
client = RubyBox::Client.new(box_session)

# prove it works by getting list of folders in root directory
folders = client.root_folder.folders
p folders
于 2013-08-17T00:03:44.463 回答
0

我使用的是 python,而不是 ruby​​,所以我不能告诉你如何编写代码,但我可以与你分享我是如何决定解决这个问题的。

我正在编写一个 python 脚本,它将观察盒子上的事件队列,然后在用户上传新文件时处理它们。

因为 python 脚本是自动化的,所以我将使用托管在 heroku ( http://box-token-generator.herokuapp.com/ ) 上的盒子令牌生成器,并使用它来开始验证我的应用程序。每次我提出请求时,我都会检查是否收到 401 Unauthorized 错误,如果收到,我会刷新我的令牌。

于 2013-08-05T18:39:27.747 回答