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
,该对象的响应正文有一个空字符串。有关暴雪建议如何处理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请求,并且响应应该包含实际的访问令牌李>
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端工作,我的代码很糟糕
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访问,因为这似乎是必需的