| @@ -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' | |||