2017-12-02 16 views
0

は、私が存在しないかではないトークンをチェックするためのモデル認証を発生Ruby On Railsでトークンをデータベースに格納する必要がありますか?

、ユーザのログインシステムを構築するために宝石jwtdeviseを使用しています。

このコードは、次のとおりです。

モデル/ authentication.rb私はuser/sessionsにPOSTリクエストを行うときに、私はトークンを取得します

class Authentication < ApplicationRecord 
    def self.generate_access_token(email) 
    payload = {:email => email} 
    secret = 'secret' 
    token = JWT.encode payload, secret, 'HS256' 
    return token 
    end 
end 

コントローラ/ユーザー/ sessions_controller.rb

def create 
    user = User.where(email: params[:email]).first 
    if user&.valid_password?(params[:password]) 
     @token = Authentication.generate_access_token(user.email) 
     Authentication.create(access_token: @token) 
     authentications = {token: @token, email: user.email} 
     render json: authentications, status: :created 
    else 
     head(:unauthorized) 
    end 
    end 

をユーザーの電子メールとクライアントのlocalstorageに格納し、トークンが有効であることを確認する手助けをします。トークンデータベースに格納する必要がありませんようにする方法があり、私の質問に

def authenticate_token 
    token = Authentication.find_by_access_token(params[:token]) 
    head :unauthorized unless token 
end 

は、このコードに従ってください?

答えて

1

トークンをデコードし、そこに格納されている電子メールを取得し、その電子メールでユーザーを見つけることができます。私があなただったら、私は、ユーザーのIDを置く

class ApplicationController < ActionController::API 
    before_action :authenticate_token 

    def authenticate_token 
    token = request.headers['Authorization'].to_s =~ /^Bearer (.*)$/i && $1 
    return head :unauthorized unless token 
    payload = JWT.decode(token, 'secret', true, algorithm: 'HS256') 
    user = User.find_by(email: payload['email']) 
    return head :unauthorized unless user 
    # TODO set the `user` as current_user 
    # How to patch devise's `current_user` helper is another story 
    end 
end 

は、あなたがこれを行うにはbefore_actionを定義することができ

Authorization: Bearer <token> 

のように、あなたはAuthorizationヘッダーにトークンを運ぶと仮定しますIDは短く、データベースから検索する方が早く、インターネットに個人的なものは何も公開していないので、電子メールではなくトークンであることに注意してください(JWTは暗号化されていません。

deviseの代わりにknockを使用するだけで、これらのばかげたことをすべてスキップできます。

+0

ありがとう、それは仕事です –

関連する問題