You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.5 KiB
54 lines
1.5 KiB
require 'base64'
|
|
|
|
class Oauth < ActiveRecord::Base
|
|
attr_accessible :client_id, :client_secret, :redirect_uri, :access_token,
|
|
:refresh_token, :token_created_at,:token_expires_in, :user_id
|
|
|
|
belongs_to :user
|
|
|
|
def gen_code
|
|
code = Base64.urlsafe_encode64 Digest::MD5.hexdigest "#{Time.now}-#{Random.new_seed}"
|
|
update_column(:code, code)
|
|
code
|
|
end
|
|
|
|
def gen_token
|
|
access_token = Digest::MD5.hexdigest "#{Time.now}-#{Random.new_seed}"
|
|
refresh_token = Digest::MD5.hexdigest "#{Random.new_seed}-#{Time.now}-#{Random.new_seed}"
|
|
|
|
self.update_attributes(access_token: access_token,
|
|
refresh_token: refresh_token,
|
|
token_created_at: Time.now.to_i,
|
|
token_expires_in: Time.now.to_i + 24*60*60,
|
|
)
|
|
end
|
|
|
|
|
|
def self.code_valid?(code)
|
|
# 1. 是否存在
|
|
oauth = Oauth.where(code: code).order("ID desc").first
|
|
return false unless oauth
|
|
|
|
# 2. 是否超过10分钟
|
|
return false if Time.now.to_i - oauth.created_at.to_i > 10*60
|
|
|
|
# 3. 是否有使用过
|
|
return false if oauth.access_token.present?
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
def self.auth_code(code, client_id, client_secret)
|
|
Oauth.where(code: code, client_id: client_id, client_secret: client_secret).order('id desc').first
|
|
end
|
|
|
|
def self.auth(access_token)
|
|
oauth = self.find_by_access_token(access_token)
|
|
return nil unless oauth
|
|
oauth.user
|
|
end
|
|
|
|
|
|
end
|