diff --git a/app/controllers/oauth/ci4s_controller.rb b/app/controllers/oauth/ci4s_controller.rb new file mode 100644 index 000000000..7ccc444bb --- /dev/null +++ b/app/controllers/oauth/ci4s_controller.rb @@ -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 diff --git a/app/libs/ci4s/service.rb b/app/libs/ci4s/service.rb new file mode 100644 index 000000000..d931a513f --- /dev/null +++ b/app/libs/ci4s/service.rb @@ -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 \ No newline at end of file diff --git a/app/models/open_users/ci4s.rb b/app/models/open_users/ci4s.rb new file mode 100644 index 000000000..8a9e1f54c --- /dev/null +++ b/app/models/open_users/ci4s.rb @@ -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 diff --git a/config/routes.rb b/config/routes.rb index 501a024b4..6a8677322 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -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'