class OmniAuth::Strategies::GoogleOauth2
Main class for Google OAuth2 strategy.
Constants
- ALLOWED_ISSUERS
- AUTHORIZE_OPTIONS
- BASE_SCOPES
- BASE_SCOPE_URL
- DEFAULT_SCOPE
- IMAGE_SIZE_REGEXP
- USER_INFO_URL
Public Instance Methods
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 95 def custom_build_access_token access_token = get_access_token(request) verify_hd(access_token) access_token end
Also aliased as: build_access_token
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 91 def raw_info @raw_info ||= access_token.get(USER_INFO_URL).parsed end
Private Instance Methods
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 110 def callback_url options[:redirect_uri] || (full_host + callback_path) end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 142 def client_get_token(verifier, redirect_uri) client.auth_code.get_token(verifier, get_token_options(redirect_uri), get_token_params) end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 114 def get_access_token(request) verifier = request.params['code'] redirect_uri = request.params['redirect_uri'] access_token = request.params['access_token'] if verifier && request.xhr? client_get_token(verifier, redirect_uri || 'postmessage') elsif verifier client_get_token(verifier, redirect_uri || callback_url) elsif access_token && verify_token(access_token) ::OAuth2::AccessToken.from_hash(client, request.params.dup) elsif request.content_type =~ /json/i begin body = JSON.parse(request.body.read) request.body.rewind # rewind request body for downstream middlewares verifier = body && body['code'] access_token = body && body['access_token'] redirect_uri ||= body && body['redirect_uri'] if verifier client_get_token(verifier, redirect_uri || 'postmessage') elsif verify_token(access_token) ::OAuth2::AccessToken.from_hash(client, body.dup) end rescue JSON::ParserError => e warn "[omniauth google-oauth2] JSON parse error=#{e}" end end end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 150 def get_scope(params) raw_scope = params[:scope] || DEFAULT_SCOPE scope_list = raw_scope.split(' ').map { |item| item.split(',') }.flatten scope_list.map! { |s| s =~ %r{^https?://} || BASE_SCOPES.include?(s) ? s : "#{BASE_SCOPE_URL}#{s}" } scope_list.join(' ') end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 161 def get_token_options(redirect_uri = '') { redirect_uri: redirect_uri }.merge(token_params.to_hash(symbolize_keys: true)) end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 146 def get_token_params deep_symbolize(options.auth_token_params || {}) end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 196 def image_params image_params = [] case options[:image_size] when Integer image_params << "s#{options[:image_size]}" when Hash image_params << "w#{options[:image_size][:width]}" if options[:image_size][:width] image_params << "h#{options[:image_size][:height]}" if options[:image_size][:height] end image_params << 'c' if options[:image_aspect_ratio] == 'square' image_params << 'p' if options[:image_aspect_ratio] == 'smart' "=#{image_params.join('-')}" end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 192 def image_size_opts_passed? options[:image_size] || options[:image_aspect_ratio] end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 172 def image_url return nil unless raw_info['picture'] u = URI.parse(raw_info['picture']) md = u.path.to_s.match(/(.*)(=((w[0-9]*|h[0-9]*|s[0-9]*|c|p)-?)*)$/) # Check for sizing, remove if present. u.path = md[1] if md && !md[1].nil? && !md[2].nil? if image_size_opts_passed? u.path += image_params u.path = u.path.gsub('//', '/') end u.query = strip_unnecessary_query_parameters(u.query) u.to_s end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 106 def nil_or_empty?(obj) obj.is_a?(String) ? obj.empty? : obj.nil? end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 165 def prune!(hash) hash.delete_if do |_, v| prune!(v) if v.is_a?(Hash) v.nil? || (v.respond_to?(:empty?) && v.empty?) end end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 211 def strip_unnecessary_query_parameters(query_parameters) # strip `sz` parameter (defaults to sz=50) which overrides `image_size` options return nil if query_parameters.nil? params = CGI.parse(query_parameters) stripped_params = params.delete_if { |key| key == 'sz' } # don't return an empty Hash since that would result # in URLs with a trailing ? character: http://image.url? return nil if stripped_params.empty? URI.encode_www_form(stripped_params) end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 225 def token_info(access_token) return nil unless access_token @token_info ||= Hash.new do |h, k| h[k] = client.request(:post, 'https://www.googleapis.com/oauth2/v3/tokeninfo', body: { access_token: access_token }).parsed end @token_info[access_token] end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 157 def verified_email raw_info['email_verified'] ? raw_info['email'] : nil end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 242 def verify_hd(access_token) return true unless options.hd @raw_info ||= access_token.get(USER_INFO_URL).parsed options.hd = options.hd.call if options.hd.is_a? Proc allowed_hosted_domains = Array(options.hd) raise CallbackError.new(:invalid_hd, 'Invalid Hosted Domain') unless allowed_hosted_domains.include?(@raw_info['hd']) || options.hd == '*' true end
Source
# File lib/omniauth/strategies/google_oauth2.rb, line 235 def verify_token(access_token) return false unless access_token token_info = token_info(access_token) token_info['aud'] == options.client_id || options.authorized_client_ids.include?(token_info['aud']) end