版本:
问题:
尝试完成对暴雪的Battle Net Community API的授权和令牌请求流程。虽然我可以返回authorization_code,但当我尝试将POST构造回令牌端点时,它会一直告诉我它是一个无效的请求/内部服务器错误,或者只返回以下对象:<Net::HTTPFound 302 Found readbody=true>
哪个空白响应正文的字符串。有关暴雪建议如何处理OAuth 2流程的详细信息,请访问:Battle.net OAuth 2 Guide。 omniauth-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
过程:
这只是一些匆忙拼凑的代码,而我正试图让这个工作。一旦我克服了这个小速度碰撞,我会清理它。我不会硬编码URI,通常情况下,只是对事情感到沮丧。
我尝试过的事情:
配置/ routes.rb中
Rails.application.routes.draw do
root to: 'pages#index'
get '/auth/:provider/callback', to: 'pages#index'
end
答案 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 访问,因为这似乎是必需的。