将通过Net :: HTTP发送POST到Battle.Net社区API端点的问题(OAuth 2)

时间:2016-02-20 01:28:27

标签: ruby-on-rails ruby oauth oauth-2.0 omniauth

版本:

  • Ruby 2.2.4
  • Rails 4.2
  • Omniauth-oauth2 1.3.1
  • Omniauth-bnet 1.1.0

问题:

尝试完成对暴雪的Battle Net Community API的授权和令牌请求流程。虽然我可以返回authorization_code,但当我尝试将POST构造回令牌端点时,它会一直告诉我它是一个无效的请求/内部服务器错误,或者只返回以下对象:<Net::HTTPFound 302 Found readbody=true>哪个空白响应正文的字符串。有关暴雪建议如何处理OAuth 2流程的详细信息,请访问:Battle.net OAuth 2 Guide。 omn​​iauth-bnet的宝石是暴雪建议的那个,但似乎并没有处理整个OAuth授权和令牌过程,但我会自由地承认,当涉及OAuth相关的任何事情时我都是全新的,所以我可能是错的。

非常欢迎你们所提供的任何帮助!

控制器代码:

def index
  client_id = ENV[BNET_CLIENT_ID]
  client_secret = ENV[BNECT_CLIENT_SECRET]
  uri = URI('https://us.battle.net/auth/token?
  redirect_uri=https%3A%2F%2f127%2f0%2f0%2f1%3A3001%2Fauth%2Fbnet%2Fcallback
    &grant_type=authorization_code
    &code=' + params["code"])
  req = Net::HTTP::Post.new(uri)
  req.basic_auth(client_id, client_secret)
  res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') {|http| http.request(req)}
  @bnet_response = res.body
end

过程:

  • 点击index.html页面上的链接,通过向https://us.battle.net/oauth/authorize?client_id=&amp; client_secret =&amp; redirect_uri =&amp; response_type = code
  • 发送GET请求来触发授权流程。
  • BNet API接受请求并将用户重定向到Battle.Net登录屏幕
  • 用户授权应用并通过redirect_uri重定向回使用authorization_code的查询参数的索引页面
  • 我的应用程序应该使用上面的控制器代码发出POST请求,响应应该包含实际的访问令牌。

这只是一些匆忙拼凑的代码,而我正试图让这个工作。一旦我克服了这个小速度碰撞,我会清理它。我不会硬编码URI,通常情况下,只是对事情感到沮丧。

我尝试过的事情:

  • 使用Rest-Client:有一个无法处理的回调重定向
  • 测试Postman:当他们使用他们的OAuth 2授权时,它工作得很好,如果我使用Postman获取授权代码(GET)和令牌(POST)也可以正常工作,所以我假设在Blizz方面工作正常我的代码很糟糕。

配置/ routes.rb中

Rails.application.routes.draw do
  root to: 'pages#index'
  get '/auth/:provider/callback', to: 'pages#index'
end

1 个答案:

答案 0 :(得分:0)

我不熟悉Battle.net API,但是阅读你的过程似乎是从查询参数(由params[:code]访问)形式的重定向中获取授权代码是否正确?< / p>

你还提到这可以使用Postman来指示缺陷必须在代码中的某处。

我建议使用以下代码段,让我知道它是否有效。我鼓励在puts url代码之后使用url = ...来确保URI看起来完全符合您的要求(并且具有正确的代码,客户端ID,密码,redirect_uri)。

require 'uri'
require 'net/http'

# Remember to change the redirect uri to match yours
redirect_uri = 'https://my-domain-name.com/auth/bnet/callback'

# Double check the environment variable names for BNET ID / Secret
url = URI("https://us.battle.net/oauth/token?redirect_uri=#{redirect_uri}&code=#{params[:code]}" \
          "&grant_type=authorization_code&scope=wow.profile&client_id=#{ENV['BNET_CLIENT_ID']}" \
          "&client_secret=#{ENV['BNET_CLIENT_SECRET']}")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)

response = http.request(request)
puts response.read_body

确保您的域名可通过 https 访问,因为这似乎是必需的。