thiry party login

dev_oauth
p31729568 5 years ago
parent 11b107987e
commit 6f05ea63cd

@ -0,0 +1,22 @@
class BindUsersController < ApplicationController
before_action :require_login
def create
user = CreateBindUserService.call(current_user, create_params)
successful_authentication(user) if user.id != current_user.id
render_ok
rescue ApplicationService::Error => ex
render_error(ex.message)
end
def new_user
current_user
end
private
def create_params
params.permit(:login, :password, :type, :not_bind)
end
end

@ -2,4 +2,8 @@ class OpenUser < ApplicationRecord
belongs_to :user
validates :uid, presence: true, uniqueness: { scope: :type }
def can_bind_cache_key
"open_user:#{type}:#{uid}:can_bind"
end
end

@ -31,6 +31,9 @@ class User < ApplicationRecord
LOGIN_CHARS = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z).freeze
has_one :user_extension, dependent: :destroy
has_many :open_users, dependent: :destroy
has_one :wechat_open_user, class_name: 'OpenUsers::Wechat'
has_one :qq_open_user, class_name: 'OpenUsers::QQ'
accepts_nested_attributes_for :user_extension, update_only: true
has_many :memos, foreign_key: 'author_id'

@ -1,6 +1,8 @@
class ApplicationService
include Callable
Error = Class.new(StandardError)
private
def strip(str)

@ -0,0 +1,51 @@
class CreateBindUserService < ApplicationService
attr_reader :user, :params
def initialize(user, params)
@user = user
@params = params
end
def call
raise Error, '系统错误' if open_user.blank?
raise Error, '系统错误' unless can_bind_user?
if params[:not_bind].to_s == 'true'
clear_can_bind_user_flag
return user
end
bind_user = User.try_to_login(params[:login], params[:password])
raise Error, '用户名或者密码错误' if bind_user.blank?
ActiveRecord::Base.transaction do
open_user.user_id = bind_user.id
open_user.save!
user.destroy!
end
clear_can_bind_user_flag
bind_user
end
private
def open_user
@_open_user ||= begin
case params[:type].to_s
when 'wechat' then user.wechat_open_user
when 'qq' then user.qq_open_user
end
end
end
def can_bind_user?
Rails.cache.read(open_user.can_bind_cache_key).present?
end
def clear_can_bind_user_flag
Rails.cache.delete(open_user.can_bind_cache_key)
end
end

@ -18,21 +18,25 @@ class Oauth::CreateOrFindWechatAccountService < ApplicationService
open_user = OpenUsers::Wechat.find_by(uid: result['unionid'])
return open_user.user if open_user.present?
new_user = false
if user.blank? || !user.logged?
new_user = true
# 新用户
login = User.generate_login('w')
@user = User.new(login: login, nickname: result['nickname'])
end
ActiveRecord::Base.transaction do
if user.new_record?
if new_user
user.save!
gender = result['sex'].to_i == 1 ? 0 : 1
user.create_user_extension!(gender: gender)
end
OpenUsers::Wechat.create!(user: user, uid: result['unionid'])
new_open_user= OpenUsers::Wechat.create!(user: user, uid: result['unionid'])
Rails.cache.write(new_open_user.can_bind_cache_key, 1, expires_in: 1.hours) if new_user # 方便后面进行账号绑定
end
user

@ -827,6 +827,7 @@ Rails.application.routes.draw do
end
resource :template, only: [:show]
resource :setting, only: [:show]
resource :bind_user, only: [:create]
end
namespace :admins do

Loading…
Cancel
Save