And*_*yan 4 json ruby-on-rails devise doorkeeper
我正在尝试为iOS应用程序创建一个登录系统,其中导轨后端由设备和门卫提供支持.
我想限制网络请求的数量,因此不希望必须从凭证中获取令牌,然后将用户详细信息作为单独的请求获取.
这是我目前的尝试:
token = Doorkeeper::AccessToken.create!(application_id: @application_id,
resource_owner_id: current_user.id, :expires_in => 168.hours)
puts token.token
render :json => {:user => current_user, :token => token.as_json(:include=> token)},
status: :ok, location: :users
Run Code Online (Sandbox Code Playgroud)
然而,返回的是:
{"user":{"id":2,"email":"user3@test.com","created_at":"2014-06-12T17:25:12.000Z",
"updated_at":"2014-06-13T12:20:18.536Z",
"firstName":"user","lastName":"test","subscription":null},
"token":{"resource_owner_id":2,"scopes":[],"expires_in_seconds":604800,
"application":{"uid":"[Filtered]"}}}
Run Code Online (Sandbox Code Playgroud)
因此,实际的access_token键不会被传回以允许我进行将来的调用.我可以看到令牌本身没有返回DoorKeeper::AccessToken.as_json,但token.as_json(:include=> token)仍然没有返回它.
有谁知道如何返回AccessToken,包括访问令牌本身,如json?
小智 5
我处理这个问题的方法是创建一个自定义令牌控制器并覆盖令牌请求操作.在那里,我可以添加自定义的东西来回应.
# app/controllers/custom_tokens_controller.rb
class CustomTokensController < 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.find(response.token.resource_owner_id) 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[:user] = user.as_json
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
Run Code Online (Sandbox Code Playgroud)
只需确保您指向此控制器 routes.rb
# routes.rb
Rails.application.routes.draw do
# Doorkeeper
use_doorkeeper do
controllers :tokens => 'custom_tokens'
end
# Your other routes here...
end
Run Code Online (Sandbox Code Playgroud)
这是经过测试的,它可以工作,我在我的项目中使用它.
| 归档时间: |
|
| 查看次数: |
5051 次 |
| 最近记录: |