fixed ci4s oauth2接入
This commit is contained in:
		
							parent
							
								
									8db7bbd51c
								
							
						
					
					
						commit
						dd3c14e50e
					
				| 
						 | 
				
			
			@ -0,0 +1,48 @@
 | 
			
		|||
class Oauth::Ci4sController < Oauth::BaseController
 | 
			
		||||
  include RegisterHelper
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  # 需要educoder那边设置回调地址
 | 
			
		||||
  def create
 | 
			
		||||
    begin
 | 
			
		||||
      code = params['code'].to_s.strip
 | 
			
		||||
      tip_exception("code不能为空") if code.blank?
 | 
			
		||||
 | 
			
		||||
      new_user = false
 | 
			
		||||
      token = Ci4s::Service.access_token(code)
 | 
			
		||||
      # result =  token[:account_info]
 | 
			
		||||
      result = Ci4s::Service.user_info(result[:access_token])
 | 
			
		||||
 | 
			
		||||
      # 存在该用户
 | 
			
		||||
      open_user = OpenUsers::Ci4s.find_by(uid: result['login'])
 | 
			
		||||
      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?
 | 
			
		||||
          new_user = true
 | 
			
		||||
          session[:unionid] = result['username']
 | 
			
		||||
          # login = User.generate_login('E')
 | 
			
		||||
          login = result['username']
 | 
			
		||||
          email = result['email']
 | 
			
		||||
          email = "#{login}@forge.com" if email.blank?
 | 
			
		||||
          reg_result = autologin_register(login,email, "Ec#{login}2021#", 'educoder', result['mobile'])
 | 
			
		||||
          if reg_result[:message].blank?
 | 
			
		||||
            open_user = OpenUsers::Ci4s.create!(user_id: reg_result[:user][:id], uid: login, extra: result)
 | 
			
		||||
            successful_authentication(open_user.user)
 | 
			
		||||
          else
 | 
			
		||||
            render_error(reg_result[:message])
 | 
			
		||||
          end
 | 
			
		||||
        else
 | 
			
		||||
          OpenUsers::Ci4s.create!(user: current_user, uid: result['login'], extra: result)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      Rails.logger.info("[OAuth2] session[:unionid] -> #{session[:unionid]}")
 | 
			
		||||
 | 
			
		||||
      redirect_to root_path(new_user: new_user)
 | 
			
		||||
    rescue Exception => ex
 | 
			
		||||
      render_error(ex.message)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
require 'oauth2'
 | 
			
		||||
 | 
			
		||||
module Ci4s::Service
 | 
			
		||||
  module_function
 | 
			
		||||
 | 
			
		||||
  def client_id
 | 
			
		||||
    config = Rails.application.config_for(:configuration)
 | 
			
		||||
    config.dig("oauth", "ci4s", "appid")
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  def client_secret
 | 
			
		||||
    config = Rails.application.config_for(:configuration)
 | 
			
		||||
    config.dig("oauth", "ci4s", "appid")
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  def base_url
 | 
			
		||||
    config = Rails.application.config_for(:configuration)
 | 
			
		||||
    config.dig("oauth", "ci4s", "base_url")
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  def redirect_uri
 | 
			
		||||
    config = Rails.application.config_for(:configuration)
 | 
			
		||||
    config.dig("oauth", "ci4s", "redirect_uri")
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  def request(method, url, params)
 | 
			
		||||
    begin 
 | 
			
		||||
      Rails.logger.info("[Ci4sOauth] [#{method.to_s.upcase}] #{url} || #{params}")
 | 
			
		||||
 | 
			
		||||
      client = Faraday.new(url: base_url)
 | 
			
		||||
      response = client.public_send(method, url, params)
 | 
			
		||||
      result = JSON.parse(response.body)
 | 
			
		||||
 | 
			
		||||
      Rails.logger.info("[Ci4sOauth] [#{response.status}] #{result}")
 | 
			
		||||
 | 
			
		||||
      result
 | 
			
		||||
    rescue Exception => e
 | 
			
		||||
      raise Gitlink::TipException.new(e.message)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def access_token(code)
 | 
			
		||||
    begin
 | 
			
		||||
      Rails.logger.info("[Ci4sOauth] [code] #{code} ")
 | 
			
		||||
      Rails.logger.info("[Ci4sOauth] [redirect_uri] #{redirect_uri} ")
 | 
			
		||||
      client = OAuth2::Client.new(client_id, client_secret, site: base_url)
 | 
			
		||||
      result = client.auth_code.get_token(code, redirect_uri: redirect_uri).to_hash
 | 
			
		||||
      return result
 | 
			
		||||
    rescue Exception => e
 | 
			
		||||
      raise Gitlink::TipException.new(e.message)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def user_info(access_token)
 | 
			
		||||
    request(:get, '/user/info', {access_token: access_token})
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
# == Schema Information
 | 
			
		||||
#
 | 
			
		||||
# Table name: open_users
 | 
			
		||||
#
 | 
			
		||||
#  id         :integer          not null, primary key
 | 
			
		||||
#  user_id    :integer
 | 
			
		||||
#  type       :string(255)
 | 
			
		||||
#  uid        :string(255)
 | 
			
		||||
#  created_at :datetime         not null
 | 
			
		||||
#  updated_at :datetime         not null
 | 
			
		||||
#  extra      :text(65535)
 | 
			
		||||
#
 | 
			
		||||
# Indexes
 | 
			
		||||
#
 | 
			
		||||
#  index_open_users_on_type_and_uid  (type,uid) UNIQUE
 | 
			
		||||
#  index_open_users_on_user_id       (user_id)
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
class OpenUsers::Ci4s < OpenUser
 | 
			
		||||
  def nickname
 | 
			
		||||
    extra&.[]('username')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def en_type
 | 
			
		||||
    'ci4s'
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -26,6 +26,7 @@ Rails.application.routes.draw do
 | 
			
		|||
  get 'auth/failure', to: 'oauth/base#auth_failure'
 | 
			
		||||
  get 'auth/cas/callback', to: 'oauth/cas#create'
 | 
			
		||||
  get 'auth/acge/callback', to: "oauth/acge#create"
 | 
			
		||||
  get 'auth/ci4s/callback', to: "oauth/ci4s#create"
 | 
			
		||||
  get 'auth/acge/refer', to: "oauth/acge#refer"
 | 
			
		||||
  get 'auth/:provider/callback', to: 'oauth/callbacks#create'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue