|
- class Oauth::CallbacksController < Oauth::BaseController
- def create
- process_callback_new
- rescue Exception => e
- Rails.logger.info "授权失败:#{e}"
- tip_exception("授权失败")
- end
-
- private
-
- def config_providers
- config = Rails.application.config_for(:configuration)
- config.dig("oauth").keys
- end
-
- # QQ: {"ret":0,"msg":"","is_lost":0,"nickname":"颜值不算太高","gender":"男","gender_type":1,"province":"","city":"","year":"2013","constellation":"","figureurl":"http://qzapp.qlogo.cn/qzapp/101508858/0F860F4B329768F47B22341C5FD9089C/30","figureurl_1":"http://qzapp.qlogo.cn/qzapp/101508858/0F860F4B329768F47B22341C5FD9089C/50","figureurl_2":"http://qzapp.qlogo.cn/qzapp/101508858/0F860F4B329768F47B22341C5FD9089C/100","figureurl_qq_1":"http://thirdqq.qlogo.cn/g?b=oidb\u0026k=My3segFVHFqVmauibJQUltw\u0026s=40\u0026t=1568887757","figureurl_qq_2":"http://thirdqq.qlogo.cn/g?b=oidb\u0026k=My3segFVHFqVmauibJQUltw\u0026s=100\u0026t=1568887757","figureurl_qq":"http://thirdqq.qlogo.cn/g?b=oidb\u0026k=My3segFVHFqVmauibJQUltw\u0026s=140\u0026t=1568887757","figureurl_type":"1","is_yellow_vip":"0","vip":"0","yellow_vip_level":"0","level":"0","is_yellow_year_vip":"0"}
- def process_callback
- Rails.logger.info("[OAuth2] omniauth.auth -> #{request.env['omniauth.auth'].inspect}")
- if auth_hash.blank?
- redirect_to("/login") && return
- end
-
- new_user = false
- platform = auth_hash[:provider]
- uid = auth_hash[:uid]
- mail = auth_hash.info.email || nil
- nickname = ["gitee", "github"].include?(platform) ? auth_hash.info.name : auth_hash.info.nickname
-
- open_user = "OpenUsers::#{platform.to_s.capitalize}".constantize.find_by(uid: uid)
- if open_user.present? && open_user.user.present?
- successful_authentication(open_user.user)
- else
- if current_user.blank? || !current_user.logged?
- has_user = User.find_by(mail: mail)
- if has_user.present?
- "OpenUsers::#{platform.to_s.capitalize}".constantize.create!(user_id: has_user.id, uid: uid, extra: auth_hash.extra)
- successful_authentication(has_user)
- else
- new_user = true
- login = build_login_name(platform, auth_hash.info.nickname)
- mail = "#{login}@example.org" if mail.blank?
- code = %W(0 1 2 3 4 5 6 7 8 9)
- rand_password = code.sample(10).join
- reg_result = autologin_register(login, mail, rand_password, platform, nil, nickname)
- Rails.logger.info("[OAuth2] omniauth.auth [reg_result] #{reg_result} ")
- if reg_result[:message].blank?
- open_user = "OpenUsers::#{platform.to_s.capitalize}".constantize.create!(user_id: reg_result[:user][:id], uid: uid, extra: auth_hash.extra)
- successful_authentication(open_user.user)
- else
- tip_exception(reg_result.present? ? reg_result[:message] : "授权失败")
- end
- end
- else
- "OpenUsers::#{platform.to_s.capitalize}".constantize.create!(user: current_user, uid: login, extra: auth_hash.extra)
- end
- end
- redirect_to root_path(new_user: new_user)
- end
-
- def process_callback_new
- Rails.logger.info("[OAuth2] omniauth.auth -> #{request.env['omniauth.auth'].inspect}")
- if auth_hash.blank?
- redirect_to("/login") && return
- end
- platform = auth_hash[:provider]
- uid = auth_hash[:uid]
- uid = auth_hash.info.unionid if platform == "wechat"
-
- open_user = "OpenUsers::#{platform.to_s.capitalize}".constantize.find_by(uid: uid)
- if open_user.present? && open_user.user.present?
- successful_authentication(open_user.user)
- redirect_to root_path(new_user: false)
- return
- else
- if current_user.blank? || !current_user.logged?
- session[:unionid] = uid
- else
- "OpenUsers::#{platform.to_s.capitalize}".constantize.create!(user: current_user, uid: uid)
- end
- end
- Rails.logger.info("[OAuth2] session[:unionid] -> #{session[:unionid]}")
- redirect_to "/bindlogin/#{platform}"
- end
-
- # gitee,github nickname=login,如果系统未占用保留原用户名
- def build_login_name(provider, nickname)
- if ["gitee", "github"].include?(provider) && User.find_by(login: nickname).blank?
- nickname
- else
- User.generate_user_login('p')
- end
- end
- end
|