2016-03-16 1 views
0

Я создаю API-интерфейс Rest с рельсами. И я хочу реализовать истечение для токена. Как это работает ? Я не внедряю разработку, потому что мне это не нужно. Я просто хочу, когда я создаю пользователя, он получил токен обновить токен. Так что это не так, потому что нет сторонних сторон, использующих api.Окончание срока действия API-интерфейсов Rails для токена авторизации пользователя

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 

Простой auth с простой сгенерированной работой токена. Но я думаю, что маркер срока действия более безопасен. Конечно, соединение связано с 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