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/failure', to: 'oauth/base#auth_failure'
|
||||||
get 'auth/cas/callback', to: 'oauth/cas#create'
|
get 'auth/cas/callback', to: 'oauth/cas#create'
|
||||||
get 'auth/acge/callback', to: "oauth/acge#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/acge/refer', to: "oauth/acge#refer"
|
||||||
get 'auth/:provider/callback', to: 'oauth/callbacks#create'
|
get 'auth/:provider/callback', to: 'oauth/callbacks#create'
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue