require 'omniauth-oauth2' require 'json' module OmniAuth module Strategies class LineMessenger < OmniAuth::Strategies::OAuth2 option :name, 'line_messenger' option :scope, 'profile openid email' option :client_options, { site: 'https://access.line.me', authorize_url: '/oauth2/v2.1/authorize', token_url: '/oauth2/v2.1/token' } # host changed def callback_phase options[:client_options][:site] = 'https://api.line.me' super end def callback_url # Fixes regression in omniauth-oauth2 v1.4.0 by https://github.com/intridea/omniauth-oauth2/commit/85fdbe117c2a4400d001a6368cc359d88f40abc7 options[:callback_url] || (full_host + script_name + callback_path) end uid { raw_info['userId'] } info do { name: raw_info['displayName'], image: raw_info['pictureUrl'], description: raw_info['statusMessage'], email: fetch_email # email: JWT.decode(access_token.params['id_token'], options['client_secret']).first&.dig('email') } end # Require: Access token with PROFILE permission issued. def raw_info @raw_info ||= JSON.load(access_token.get('v2/profile').body) rescue ::Errno::ETIMEDOUT raise ::Timeout::Error end def fetch_email data = JSON.load(access_token.post('oauth2/v2.1/verify', params: { id_token: access_token.params['id_token'], client_id: options['client_id'] }).body) data['email'] rescue ::Errno::ETIMEDOUT raise ::Timeout::Error end end end end