Sha256: 5d642dac5d392d6460e701275bfd2b05a22d4ef5e60bb6999dee8a2b46fac908

Contents?: true

Size: 1.48 KB

Versions: 4

Compression:

Stored size: 1.48 KB

Contents

require 'google-id-token'
require 'active_support/core_ext/class/attribute'
require 'active_support/core_ext/numeric/time'

module GoogleSignIn
  class Identity
    class_attribute :client_id

    class_attribute :token_expiry
    self.token_expiry = 5.minutes

    class_attribute :logger
    self.logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT)

    def initialize(token)
      ensure_client_id_present
      set_extracted_payload(token)
      ensure_proper_audience
    end

    def user_id
      @payload["sub"]
    end

    def name
      @payload["name"]
    end

    def email_address
      @payload["email"]
    end

    def email_verified?
      @payload["email_verified"] == "true"
    end

    def avatar_url
      @payload["picture"]
    end

    def locale
      @payload["locale"]
    end

    private
      def ensure_client_id_present
        if client_id.blank?
          raise ArgumentError, "GoogleSignIn.client_id must be set to validate identity"
        end
      end

      def set_extracted_payload(token)
        @payload = GoogleIDToken::Validator.new(expiry: token_expiry).check(token, client_id)
      rescue GoogleIDToken::ValidationError => e
        logger.error "Google token failed to validate (#{e.message})"
        @payload = {}
      end

      def ensure_proper_audience
        unless @payload["aud"].include?(client_id)
          raise "Failed to locate the client_id #{client_id} in the authorized audience (#{@payload["aud"]})"
        end
      end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
google_sign_in-0.1.4 lib/google_sign_in/identity.rb
google_sign_in-0.1.3 lib/google_sign_in/identity.rb
google_sign_in-0.1.2 lib/google_sign_in/identity.rb
google_sign_in-0.1.1 lib/google_sign_in/identity.rb