Post 在 Rails 控制器中请求 Instagram 身份验证
Post request in Rails controller for instagram authentication
所以,我试图让我的应用程序的用户使用 Instagram 登录,然后使用他们的 access_token 执行对 Instagram API 的请求。
我查看了 omniauth-instagram rails gem,但它似乎不适用于访问令牌,而且我似乎无法发送重定向 uri。
所以,现在我尝试自己做授权,以omniauth gem为例。到目前为止,我的 html 中有一个 link 到 Instagram API:<a href="https://api.instagram.com/oauth/authorize/?client_id= <%=ENV["INSTAGRAM_KEY"]%>&redirect_uri=<%= "http://localhost:3000/auth/instagram/request_token" %>&response_type=code">Instagram</a>
redirect-uri然后来到这个方法:
def request_token
@code = params[:code]
uri = URI.parse('https://api.instagram.com/oauth/access_token')
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data({
"client_id" => ENV["INSTAGRAM_KEY"],
"client_secret" => ENV["INSTAGRAM_SECRET"],
"grant_type" => "authorization_code",
"redirect_uri" => "http://localhost:3000/auth/instagram/access",
"code" => @code
})
end
我需要 net/https。仍然唯一发生的事情是显示与 request_token 关联的视图。 http请求似乎没有发生任何事情。我对使用 net/http 很陌生。我缺少的东西可能非常明显,但我就是看不到。一些帮助将不胜感激。
您已经设置了请求,但现在您需要执行它。你用 Net::HTTP.start
来做到这一点。这是来自 the documentation 的示例:
uri = URI('http://www.example.com/todo.cgi')
req = Net::HTTP::Post.new(uri)
req.set_form_data('from' => '2005-01-01', 'to' => '2005-03-31')
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(req)
end
case res
when Net::HTTPSuccess, Net::HTTPRedirection
# OK
else
res.value
end
许多人发现 Net::HTTP
不必要地巴洛克风格,因此您也可以考虑使用一些 HTTP gem,例如 Faraday or HTTParty, which have terser APIs. Continuing with Net::HTTP
, you might find this cheat sheet。
所以,我试图让我的应用程序的用户使用 Instagram 登录,然后使用他们的 access_token 执行对 Instagram API 的请求。
我查看了 omniauth-instagram rails gem,但它似乎不适用于访问令牌,而且我似乎无法发送重定向 uri。
所以,现在我尝试自己做授权,以omniauth gem为例。到目前为止,我的 html 中有一个 link 到 Instagram API:<a href="https://api.instagram.com/oauth/authorize/?client_id= <%=ENV["INSTAGRAM_KEY"]%>&redirect_uri=<%= "http://localhost:3000/auth/instagram/request_token" %>&response_type=code">Instagram</a>
redirect-uri然后来到这个方法:
def request_token
@code = params[:code]
uri = URI.parse('https://api.instagram.com/oauth/access_token')
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data({
"client_id" => ENV["INSTAGRAM_KEY"],
"client_secret" => ENV["INSTAGRAM_SECRET"],
"grant_type" => "authorization_code",
"redirect_uri" => "http://localhost:3000/auth/instagram/access",
"code" => @code
})
end
我需要 net/https。仍然唯一发生的事情是显示与 request_token 关联的视图。 http请求似乎没有发生任何事情。我对使用 net/http 很陌生。我缺少的东西可能非常明显,但我就是看不到。一些帮助将不胜感激。
您已经设置了请求,但现在您需要执行它。你用 Net::HTTP.start
来做到这一点。这是来自 the documentation 的示例:
uri = URI('http://www.example.com/todo.cgi')
req = Net::HTTP::Post.new(uri)
req.set_form_data('from' => '2005-01-01', 'to' => '2005-03-31')
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(req)
end
case res
when Net::HTTPSuccess, Net::HTTPRedirection
# OK
else
res.value
end
许多人发现 Net::HTTP
不必要地巴洛克风格,因此您也可以考虑使用一些 HTTP gem,例如 Faraday or HTTParty, which have terser APIs. Continuing with Net::HTTP
, you might find this cheat sheet。