Ruby on rails 通过Net::HTTP向Battle.Net社区API端点(OAuth 2)发送帖子时出现的问题

Ruby on rails 通过Net::HTTP向Battle.Net社区API端点(OAuth 2)发送帖子时出现的问题,ruby-on-rails,ruby,oauth,oauth-2.0,omniauth,Ruby On Rails,Ruby,Oauth,Oauth 2.0,Omniauth,版本: 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_c

版本:

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
  • Ruby 2.2.4
  • 轨道4.2
  • Omniauth-oauth2 1.3.1
  • Omniauth bnet 1.1.0
问题:

尝试完成暴雪战网社区API的授权和令牌请求过程。虽然我可以获得返回的授权代码,但当我尝试构造回令牌端点的POST时,它会不断告诉我这是无效的请求/内部服务器错误,或者只是返回以下对象:
,该对象的响应正文有一个空字符串。有关暴雪建议如何处理OAuth 2进程的详细信息,请参阅:。omniauth bnet gem是暴雪建议的,但似乎无法处理整个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
过程:

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页面上的链接,该页面通过向&client\u secret=&redirect\u uri=&response\u type=code发送GET请求来触发授权过程
  • BNet API接受请求并将用户重定向到Battle.Net登录屏幕
  • 用户授权应用程序并被重定向(通过redirect_uri)回带有授权代码查询参数的索引页
  • 我的应用程序应该使用上面的控制器代码发出POST请求,并且响应应该包含实际的访问令牌
这只是一些匆忙拼凑起来的代码,而我正试图让它工作。我过了这个小减速带就把它清理干净。我通常不会硬编码URI之类的东西,只是对一些事情感到沮丧

我尝试过的事情:

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
  • 使用Rest客户端:有一个回调重定向,它显然无法处理
  • 测试邮递员:当使用他们的OAuth 2授权时,它工作得很好,如果我使用邮递员来获取授权代码(get)和令牌(POST),它也工作得很好,所以我假设在Blizz端工作,我的代码很糟糕
config/routes.rb

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

我不熟悉Battle.net API,但是在阅读您的流程时,您似乎正在以查询参数的形式从重定向中获取授权代码(通过
params[:code]
访问),对吗

您还提到,这项工作使用邮递员指示缺陷必须在代码中的某个地方

我建议使用下面的代码片段,并让我知道它是否有效。我鼓励在
url=…
代码之后使用
put url
,以确保URI看起来完全符合您的需要(并且具有正确的代码、客户端id、密码、重定向URI)


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

我不熟悉Battle.net API,但是在阅读您的流程时,您似乎正在以查询参数的形式从重定向中获取授权代码(通过
params[:code]
访问),对吗

您还提到,这项工作使用邮递员指示缺陷必须在代码中的某个地方

我建议使用下面的代码片段,并让我知道它是否有效。我鼓励在
url=…
代码之后使用
put url
,以确保URI看起来完全符合您的需要(并且具有正确的代码、客户端id、密码、重定向URI)

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