0

在阅读Stored Android Accounts for Authentication of Rails + Devise Accounts之后,我正在尝试设置一个 Rails 3 API 端点,该端点可以通过对 Google 的 GET 请求验证 OAuth 获得的令牌。

我已将路线配置为:

namespace :api, defaults: {format: :json} do
  namespace :v1 do
    get 'auth/verify' => 'omniauth_verifications#verify_token'
    ...
  end
end

api/v1/omniauth_verifications_controller.rb我将方法定义为:

respond_to :json

def verify_token
  token = params[:token]

  response = RestClient.get("https://www.googleapis.com/oauth2/v2/userinfo", { params: { access_token: token }})

  if response.code == 200
    data = JSON.parse(response.to_s)

    @user = User.find_for_verfied_token_response(data.symbolize_keys)
  end

  respond_with @user
end

问题是,我在到达端点时得到的响应是500 Internal Server Error一条Template Missing消息

如果我用注释掉这一行,RestClient.get而是用respond_with User.find(1)json201格式的用户对象按预期返回。

为什么 Rails 坚持渲染模板,即使我明确告诉它要渲染respond_with @user?是RestClient接管我的回应还是发生了什么?

我也尝试在 之后引发异常RestClient.get,但输出仍然是Template Missing.

4

2 回答 2

0
respond_to :json

def verify_token
  token = params[:token]

  response = RestClient.get("https://www.googleapis.com/oauth2/v2/userinfo", { params: { access_token: token }})

  if response.code == 200
    data = JSON.parse(response.to_s)

    @user = User.find_for_verfied_token_response(data.symbolize_keys)

    render :json => @user.to_json
  else
    render :json => { }
  end     
end
于 2013-05-17T16:33:06.337 回答
0

我切换到HTTParty gem,它解决了请求覆盖respond_with​​.

我不得不回到 OAuth2 游乐场,发现 Google 现在Authorization在请求用户信息时也需要一个标头。

这就是我最终的结果:

def verify_token
  token = params[:token]

  response = HTTParty.get("https://www.googleapis.com/oauth2/v2/userinfo", headers: {"Access_token" => token, "Authorization" => "OAuth #{token}"})

  if response.code == 200
    data = JSON.parse(response.body)
    @user = User.find_for_verfied_token_response(data.symbolize_keys)
  end

  respond_with @user || {}
end
于 2013-05-17T18:13:47.760 回答