覆盖门卫AccessToken控制器似乎不适用于Heroku

时间:2016-06-19 13:28:48

标签: ruby-on-rails heroku oauth doorkeeper

负责的代码不是特定于环境的,但它在本地工作但不在生产中:

对我的app&#s; / oauth / token的POST请求应重定向到控制器,覆盖默认的Doorkeeper令牌响应,如第一条路线所示

的routes.rb

require 'api_constraints'

Rails.application.routes.draw do
  use_doorkeeper do
    controllers :tokens => 'access_token'
  end
  # Other routes
end

以上在本地服务器上工作正常,但在生产[Heroku]中,这似乎被忽略了,而是无条件地路由到默认的门卫类。因此,令牌的响应不包含用户ID。

请求" https://myapp.herokuapp.com/oauth/token"

POST /oauth/token HTTP/1.1
Host: myapp.herokuapp.com
Cache-Control: no-cache
Postman-Token: xxxxxxxx
Content-Type: application/x-www-form-urlencoded

grant_type=password&email=john%40gmail.com&password=password

这回归JSON回应:

{
"access_token": "XXXXXX",
"token_type": "bearer",
"created_at": 1466340696
}

对" http://localhost:3000/oauth/token"的同一请求返回

{
"access_token": "XXXXXX",
"token_type": "bearer",
"created_at": 1466341435,
"id": 1
}

正确包含user_id。我不确定是否存在某种缓存问题,这会导致我的生产服务器使用旧的路由文件。我已经尝试重新启动dynos并将进一步的更改推送到heroku master但是这并没有解决问题。

access_token_controller

class AccessTokenController < Doorkeeper::TokensController

  # Overriding create action
  # POST /oauth/token
  def create
    response = strategy.authorize
    body = response.body

    if response.status == :ok
      # User the resource_owner_id from token to identify the user
      user = User.where(response.token.resource_owner_id).first rescue nil

      unless user.nil?
        ### If you want to render user with template
        ### create an ActionController to render out the user
        # ac = ActionController::Base.new()
        # user_json = ac.render_to_string( template: 'api/users/me', locals: { user: user})
        # body[:user] = Oj.load(user_json)

        ### Or if you want to just append user using 'as_json'
        body[:id] = response.token.resource_owner_id
      end
    end

    self.headers.merge! response.headers
    self.response_body = body.to_json
    self.status        = response.status

  rescue Doorkeeper::Errors::DoorkeeperError => e
    handle_token_exception e
  end
end

对任何混淆表示歉意,并提前感谢您对此的任何帮助。

1 个答案:

答案 0 :(得分:1)

终于开始工作了。

由于我不知道的原因,Postgres没有找到导致它为nil的用户,并且后续的if语句a没有被执行,因此为什么resource_owner_id没有附加。但是在SQLite3本地,这不是问题。我确信这里有一些非常基本的东西,一般都是在Heroku或PG上进行开发。我很感激任何建议,如果我自己找到任何东西,我也会在这里发布。

访问令牌控制器的工作版本

unless user.nil?