class SsoLoginBoxController < SessionsController require 'openssl' OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE def oauth2_auth_page session[:referer_url] = params[:referer_url] redirect_to "https://cas.ccu.edu.tw/oauth2.0/authorize?response_type=#{ENV['RESPONSE_TYPE']}&client_id=#{ENV['APP_ID']}&redirect_uri=#{ENV['REDIRECT_URI']}" end def oauth2_sign_in # receive code from ntnu code = params[:code] # request token by code token_connection = Faraday.new 'https://cas.ccu.edu.tw/oauth2.0/accessToken' token_response = token_connection.post do |request| request.params['grant_type'] = 'authorization_code' request.params['client_id'] = ENV['APP_ID'] request.params['client_secret'] = ENV['APP_SECRET'] request.params['redirect_uri'] = ENV['REDIRECT_URI'] request.params['code'] = code end token = JSON.parse(token_response.body)['access_token'] # render :html => {:code => code,:token => token, :response => token_response.body} # request user id by token account_connection = Faraday.new 'https://cas.ccu.edu.tw/oauth2.0/profile' account_response = account_connection.get do |request| request.params['access_token'] = token end user_name = JSON.parse(account_response.body)['id'] user = User.find_by(user_name: user_name) rescue nil if !user.nil? session[:user_id] = user.id session[:login_referer] = nil if session[:referer_url].present? redirect_to URI.parse(session[:referer_url]).path else redirect_to admin_dashboards_path end else @login_referer = session[:referer_url] flash.now.alert = I18n.t("sso_login_box_for_ccu.user_not_in_database",:user_id=>user_name) render "new" end end end