2016-06-19 1 views
1

で動作するようには思えません Doorkeepers AccessTokenコントローラをオーバーライドする責任のコードは、特定の環境ではない、まだそれが生産にローカルではなく、作品Herokuの

require 'api_constraints' 

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

上記しかし本番では、ローカルサーバー上で正常に動作します

routes.rbを最初のルートに示すように、守衛トークン応答は[Herokuのは]これは無視しているようだし、代わりにdoorkeepeをデフォルトにルーティングされます明白な理由のないクラスです。したがって、トークンによる応答にはユーザーIDは含まれません。

REQUEST TO "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は" 正しく含まUSER_IDと

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

を返します。私は、プロダクションサーバが古いルートファイルを使用するようなキャッシュ問題があるかどうかはわかりません。私はdynosを再起動し、herokuマスターに更なる変更を加えようとしましたが、これで問題は解決されませんでした。混乱のため

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 

access_token_controller謝罪し、これにどのような援助のため、事前に感謝します。

+0

のバージョンの作業

は、あなたがあなたのHerokuのマシンに対応する 'User'を持っていますか? – Uzbekjon

+0

こんにちは@Uzbekjon、はい私は確信しています。私はユーザーアカウントで正常にログインすることができますが、JSON APIを使用してアクセストークンを取得することもできますが、localhostのJSONレスポンスだけが 'id'パラメータをアタッチするだけで、herokuはこれまでの3つのフィールド私のコードの。 –

+0

@Uzbekjonユーザーはマシンに存在していましたが、 'user = User.where(response.token.resource_owner_id).first rescue nil'で割り当てられていないようです。 –

答えて

0

最後に動作しました。

理由がわからないのは、Postgresがユーザが見つからないため、後でif文unless user.nil?が実行されなかったため、なぜresource_owner_idがアタッチされていないのかということです。しかし、SQLite3を使ってローカルではこれは問題ではありませんでした。私はHerokuやPGの一般的な開発に欠けている、非常に基本的なものがあると確信しています。私は何かアドバイスをいただければ幸いです。私が何かを見つけた場合は、私もここに掲載します。アクセストークンコントローラ

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 
関連する問題