module SskLine
Public Class Methods
env_key_check(request,key)
click to toggle source
# File lib/ssk_line.rb, line 30 def self.env_key_check(request,key) if ENV.has_key?(key) == false then request.flash[:danger]=',環境変数'+key+'が存在しません' end end
get_access_token(request,controller)
click to toggle source
# File lib/ssk_line.rb, line 59 def self.get_access_token(request,controller) if request.params.has_key?(:code) == false then request.flash[:danger] = 'codeがありません' and return false end res = HtReq.get_json_data({ :method => 'POST', :url => 'https://api.line.me/oauth2/v2.1/token', :params =>{ 'grant_type'=>'authorization_code', 'code'=>request.params[:code], 'redirect_uri'=>ENV['LINEAPI_CALLBACK_URL'], 'client_id'=>ENV['LINEAPI_CHANNEL_ID'], 'client_secret'=>ENV['LINEAPI_CHANNEL_SECRET'] }, :header=>{'Content-Type'=>'application/x-www-form-urlencoded'} }) if res then return res["access_token"] else return false end end
get_line_profile(access_token)
click to toggle source
# File lib/ssk_line.rb, line 49 def self.get_line_profile(access_token) res = HtReq.get_json_data({ :method => 'GET', :url => 'https://api.line.me/v2/profile', :params =>{}, :header=>{'Authorization'=>'Bearer '+access_token} }) if res then return res else return false end end
instance_method_check(request,user_class,key)
click to toggle source
# File lib/ssk_line.rb, line 26 def self.instance_method_check(request,user_class,key) if user_class.new.methods.include?(key) == false then request.flash[:danger] =','+user_class.name.to_s+'に'+key.to_s+'が存在しません' end end
line_csrf_check(request)
click to toggle source
# File lib/ssk_line.rb, line 88 def self.line_csrf_check(request) #ログインしていないのにstateがなければfalse if request.params.has_key?(:state) == false then request.flash[:danger] = 'ログインしてください' and return false end #セッションにline_csrfがなければfalse if request.session.has_key?(:line_csrf) === false then request.flash[:danger] = 'ログインしてください' and return false end #トークンが一致しなければfalse、一致していればセッションからline_csrfを削除 if request.params[:state] == request.session[:line_csrf] then request.session.delete(:line_csrf) and return true else request.flash[:danger]='トークンが一致しません' and return false end end
line_login_process(request,controller,user_class)
click to toggle source
# File lib/ssk_line.rb, line 77 def self.line_login_process(request,controller,user_class) if self.status_check(request,controller,user_class) == false then controller.redirect_to controller.root_path and return false end if self.line_csrf_check(request) == false then controller.redirect_to controller.root_path and return false end access_token = self.get_access_token(request,controller) if access_token == false then controller.redirect_to controller.root_path and request.flash[:danger]='アクセストークンが取得できません。' and return false end profile = self.get_line_profile(access_token) if profile == false then controller.redirect_to controller.root_path and request.flash[:danger]='LINEアカウントのプロフィールが取得できません。' and return false end self.login_process(profile,user_class,request) return true end
login_process(line_profile,user_class,request)
click to toggle source
# File lib/ssk_line.rb, line 34 def self.login_process(line_profile,user_class,request) line_profile.has_key?("pictureUrl") ? picture = line_profile["pictureUrl"] : picture = nil #最初のユーザーは管理者にする。それ以外は初期値としては管理者にしない user_class::count == 0 ? admin = true : admin = false #ユーザーが存在しなければ if user_class::where('lineid = ?',line_profile["userId"]).count == 0 #新規ユーザーとして追加 user = user_class.create(:lineid =>line_profile["userId"],:dname=>line_profile["displayName"],:picture=>picture,:admin=>admin,:teacher=>false) else user=user_class.find_by(:lineid => line_profile["userId"]) user.update(:dname=>line_profile["displayName"],:picture=>picture) end request.session[:user_id]=user.id end
login_url(request)
click to toggle source
セッションに現在のcsrfトークンを入れて、 Lineログイン用のURLを返す関数
# File lib/ssk_line.rb, line 6 def self.login_url(request) if self.env_not_exist?(request) then return false end request.session[:line_csrf] = request.session[:_csrf_token] 'https://access.line.me/oauth2/v2.1/authorize?response_type=code&client_id='+ENV['LINEAPI_CHANNEL_ID']+'&redirect_uri='+ENV['LINEAPI_CALLBACK_URL']+'&state='+request.session[:line_csrf]+'&scope=profile%20openid' end
status_check(request,controller,user_class)
click to toggle source
最低限の設定がされているかのチェック
# File lib/ssk_line.rb, line 13 def self.status_check(request,controller,user_class) request.flash[:danger]='' self.env_key_check(request,'LINEAPI_CHANNEL_ID') self.env_key_check(request,'LINEAPI_CALLBACK_URL') self.env_key_check(request,'LINEAPI_CHANNEL_SECRET') self.instance_method_check(request,user_class,:teacher) self.instance_method_check(request,user_class,:admin) self.instance_method_check(request,user_class,:lineid) self.instance_method_check(request,user_class,:dname) self.instance_method_check(request,user_class,:picture) if request.flash[:danger].length > 0 then return false else return true end end
Private Class Methods
env_not_exist?(request)
click to toggle source
# File lib/ssk_line.rb, line 99 def self.env_not_exist?(request) if ENV.has_key?('LINEAPI_CHANNEL_ID') && ENV.has_key?('LINEAPI_CALLBACK_URL') && ENV.has_key?('LINEAPI_CHANNEL_SECRET') return false else request.flash.now[:danger]='SskLineを使用するために必要な環境変数が設定されておりません' return true end end