重写 Doorkeepers AccessToken 控制器似乎在 Heroku 中不起作用
Overriding Doorkeepers AccessToken Controller does not seem to work in Heroku
负责的代码不是特定于环境的,但它在本地工作但不在生产环境中工作:
POST 对我的应用 /oauth/token 的请求应该重定向到一个控制器,覆盖默认的门卫令牌响应,如第一条路线所示
routes.rb
require 'api_constraints'
Rails.application.routes.draw do
use_doorkeeper do
controllers :tokens => 'access_token'
end
# Other routes
end
以上在本地服务器上运行良好,但在生产环境中[Heroku] 这似乎被忽略了,而是无缘无故地路由到默认门卫 class。因此带有令牌的响应不包含用户 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
这个RETURNSJSON回复:
{
"access_token": "XXXXXX",
"token_type": "bearer",
"created_at": 1466340696
}
对“http://localhost:3000/oauth/token”的相同请求returns
{
"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
对于任何混淆,我们深表歉意,并提前感谢您对此提供的任何帮助。
终于成功了。
出于我不知道的原因,Postgres 没有找到导致它为 nil 的用户,随后的 if 语句 unless user.nil?
没有被执行,因此 resource_owner_id 没有附加。但是在本地使用 SQLite3 这不是问题。我敢肯定,在 Heroku 或 PG 上进行开发时,我通常缺少一些非常基本的东西。我将不胜感激任何建议,如果我自己找到任何东西,我也会 post 在这里。
访问令牌控制器的工作版本
class AccessTokenController < Doorkeeper::TokensController
# Overriding create action
# POST /oauth/token
def create
response = strategy.authorize
body = response.body
if response.status == :ok
# Return user id
body[:id] = response.token.resource_owner_id unless nil
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
负责的代码不是特定于环境的,但它在本地工作但不在生产环境中工作:
POST 对我的应用 /oauth/token 的请求应该重定向到一个控制器,覆盖默认的门卫令牌响应,如第一条路线所示
routes.rb
require 'api_constraints'
Rails.application.routes.draw do
use_doorkeeper do
controllers :tokens => 'access_token'
end
# Other routes
end
以上在本地服务器上运行良好,但在生产环境中[Heroku] 这似乎被忽略了,而是无缘无故地路由到默认门卫 class。因此带有令牌的响应不包含用户 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
这个RETURNSJSON回复:
{
"access_token": "XXXXXX",
"token_type": "bearer",
"created_at": 1466340696
}
对“http://localhost:3000/oauth/token”的相同请求returns
{
"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
对于任何混淆,我们深表歉意,并提前感谢您对此提供的任何帮助。
终于成功了。
出于我不知道的原因,Postgres 没有找到导致它为 nil 的用户,随后的 if 语句 unless user.nil?
没有被执行,因此 resource_owner_id 没有附加。但是在本地使用 SQLite3 这不是问题。我敢肯定,在 Heroku 或 PG 上进行开发时,我通常缺少一些非常基本的东西。我将不胜感激任何建议,如果我自己找到任何东西,我也会 post 在这里。
访问令牌控制器的工作版本
class AccessTokenController < Doorkeeper::TokensController
# Overriding create action
# POST /oauth/token
def create
response = strategy.authorize
body = response.body
if response.status == :ok
# Return user id
body[:id] = response.token.resource_owner_id unless nil
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