加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何将门卫访问令牌作为json返回

发布时间:2020-12-17 03:41:11 所属栏目:百科 来源:网络整理
导读:我正在尝试为iOS应用程序创建一个登录系统,其中导轨后端由设备和门卫提供支持. 我想限制网络请求的数量,因此不希望必须从凭证中获取令牌,然后将用户详细信息作为单独的请求获取. 这是我目前的尝试: token = Doorkeeper::AccessToken.create!(application_id
我正在尝试为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

然而,返回的是:

{"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]"}}}

因此,实际的access_token键不会被传回以允许我进行将来的调用.
我可以看到在DoorKeeper :: AccessToken.as_json中没有返回令牌本身,但token.as_json(:include =>令牌)仍然没有返回它.

有谁知道如何返回AccessToken,包括访问令牌本身,如json?

解决方法

我处理这个问题的方法是创建一个自定义令牌控制器并覆盖令牌请求操作.在那里,我可以添加自定义的东西来回应.

# 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

只需确保在routes.rb中指向此控制器即可

# routes.rb
Rails.application.routes.draw do

  # Doorkeeper
  use_doorkeeper do
    controllers :tokens => 'custom_tokens'
  end

  # Your other routes here...

end

这是经过测试的,它可以工作,我在我的项目中使用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读