2016-03-16 49 views
0

我使用rails構建Rest API。我想爲令牌實施到期。它是如何工作的? 我不想實現設計,因爲我不需要那麼做。 我只想當我創建一個用戶,他收到一個令牌刷新令牌。 所以它不是真的oauth,因爲沒有第三方使用api。用戶認證令牌的Rails API過期

This is my user model. 
    require 'securerandom' 
     class User 
     field :auth_token, type: String 
     field :name, type: String 
     field :phone, type: String 
     field :image, type: String 

     #Generate URLS for different image sizes... 
     def as_json(options) 
     json = super 
     self.image.styles.each do | format | 
      json = json.merge({"image_"+format[0].to_s => self.image(format[0])}) 
     end 
     json 
     end 

     private 
     def set_auth_token 
      return if auth_token.present? 
      self.auth_token = generate_auth_token 
     end 

     def generate_auth_token 
      SecureRandom.hex(90) 
     end 

     end 

如此簡單的認證與一個簡單的生成令牌的作品。但我認爲使用過期令牌更安全。當然,連接是通過SSL。

class ApplicationController < ActionController::API 
    include ActionController::HttpAuthentication::Token::ControllerMethods 

    def current_user 
     @current_user = User.find(params[:user_id]) 
    end 


protected 

    def authenticate 
     authenticate_token || authentication_request 
    end 


    def authenticate_token 
     authenticate_or_request_with_http_token do |token, options| 
     User.where(auth_token: token).first 
     end 
    end 

    def authentication_request(controller, realm) 
     controller.headers["WWW-Authenticate"] = %(Token realm="#{realm.gsub(/"/, "")}") 
     controller.__send__ :render, :text => "HTTP Token: Access denied.\n", :status => :unauthorized 
    end 

    def request_http_token_authentication(realm = "Application") 
     self.headers["WWW-Authenticate"] = %(Token realm="#{realm.gsub(/"/, "")}") 
     render :json => {:error => "HTTP Token: Access denied."}, :status => :unauthorized 
    end 

end 

回答

2

當您生成令牌,節省您想它到期時間:

class User 
    field :auth_token, type: String 
    field :token_expiry, type: Time 

    def set_auth_token 
    return if auth_token.present? && token_expiry > Time.now 
    self.auth_token = generate_auth_token 
    self.token_expiry = Time.now + 1.day 
    end 

然後當您檢查令牌,查看食用過多:

def authenticate_token 
    authenticate_or_request_with_http_token do |token, options| 
    user = User.where(auth_token: token).first 
    user if user.token_expiry > Time.now 
    end 
end 
+0

謝謝你!爲你的答案:)以及它如何與刷新令牌一起工作?因爲我想如果令牌過期,用戶收到一個新的?所以我想創建2個令牌一個授權令牌和一個刷新令牌。需要刷新令牌才能獲得新的令牌?:/ – BilalReffas

+0

不管您喜歡如何,您都可以刷新令牌 - 如果您需要用戶必須交換的第二個令牌,請構建它。 –

+0

謝謝你好,它從安全的角度來看更好隱藏令牌何時呈現它? – BilalReffas