Class: Signet::OAuth2::Client

Inherits:
Object
  • Object
show all
Includes:
Google::Auth::BaseClient
Defined in:
lib/googleauth/signet.rb

Overview

Signet::OAuth2::Client creates an OAuth2 client

This reopens Client to add #apply and #apply! methods which update a hash with the fetched authentication token.

Constant Summary

Constants included from Google::Auth::BaseClient

Google::Auth::BaseClient::AUTH_METADATA_KEY

Instance Attribute Summary collapse

Attributes included from Google::Auth::BaseClient

#logger

Instance Method Summary collapse

Methods included from Google::Auth::BaseClient

#apply, #apply!, #expires_within?, #needs_access_token?, #notify_refresh_listeners, #on_refresh, #updater_proc

Instance Attribute Details

#universe_domainObject

Set the universe domain



70
71
72
# File 'lib/googleauth/signet.rb', line 70

def universe_domain
  @universe_domain
end

Instance Method Details

#build_default_connectionObject



103
104
105
106
107
108
109
110
111
# File 'lib/googleauth/signet.rb', line 103

def build_default_connection
  if !defined?(@connection_info)
    nil
  elsif @connection_info.respond_to? :call
    @connection_info.call
  else
    @connection_info
  end
end

#configure_connection(options) ⇒ Object



58
59
60
61
62
# File 'lib/googleauth/signet.rb', line 58

def configure_connection options
  @connection_info =
    options[:connection_builder] || options[:default_connection]
  self
end

#duplicate(options = {}) ⇒ Object

Creates a duplicate of these credentials without the Signet::OAuth2::Client-specific transient state (e.g. cached tokens)

Parameters:

  • (defaults to: {})

    Overrides for the credentials parameters.

See Also:



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/googleauth/signet.rb', line 160

def duplicate options = {}
  options = deep_hash_normalize options

  opts = {
    authorization_uri: @authorization_uri,
    token_credential_uri: @token_credential_uri,
    client_id: @client_id,
    client_secret: @client_secret,
    scope: @scope,
    target_audience: @target_audience,
    redirect_uri: @redirect_uri,
    username: @username,
    password: @password,
    issuer: @issuer,
    person: @person,
    sub: @sub,
    audience: @audience,
    signing_key: @signing_key,
    extension_parameters: @extension_parameters,
    additional_parameters: @additional_parameters,
    access_type: @access_type,
    universe_domain: @universe_domain,
    logger: @logger
  }.merge(options)

  new_client = self.class.new opts

  new_client.configure_connection options
end

#fetch_access_token!(options = {}) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
# File 'lib/googleauth/signet.rb', line 73

def fetch_access_token! options = {}
  unless options[:connection]
    connection = build_default_connection
    options = options.merge connection: connection if connection
  end
  info = retry_with_error do
    orig_fetch_access_token! options
  end
  notify_refresh_listeners
  info
end

#generate_access_token_request(options = {}) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/googleauth/signet.rb', line 86

def generate_access_token_request options = {}
  parameters = googleauth_orig_generate_access_token_request options
  logger&.info do
    Google::Logging::Message.from(
      message: "Requesting access token from #{parameters['grant_type']}",
      "credentialsId" => object_id
    )
  end
  logger&.debug do
    Google::Logging::Message.from(
      message: "Token fetch params: #{parameters}",
      "credentialsId" => object_id
    )
  end
  parameters
end

#googleauth_orig_generate_access_token_requestObject



85
# File 'lib/googleauth/signet.rb', line 85

alias googleauth_orig_generate_access_token_request generate_access_token_request

#orig_fetch_access_token!Object



72
# File 'lib/googleauth/signet.rb', line 72

alias orig_fetch_access_token! fetch_access_token!

#retry_with_error(max_retry_count = 5) { ... } ⇒ Object

Retries the provided block with exponential backoff, handling and wrapping errors.

Parameters:

  • (defaults to: 5)

    The maximum number of retries before giving up

Yields:

  • The block to execute and potentially retry

Returns:

  • The result of the block if successful

Raises:

  • If a Signet::AuthorizationError occurs or if retries are exhausted

  • If a Signet::ParseError occurs during token parsing



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/googleauth/signet.rb', line 122

def retry_with_error max_retry_count = 5
  retry_count = 0

  begin
    yield.tap { |resp| log_response resp }
  rescue Signet::AuthorizationError, Signet::ParseError => e
    log_auth_error e
    error_class = e.is_a?(Signet::ParseError) ? Google::Auth::ParseError : Google::Auth::AuthorizationError
    raise error_class.with_details(
      e.message,
      credential_type_name: self.class.name,
      principal: respond_to?(:principal) ? principal : :signet_client
    )
  rescue StandardError => e
    if retry_count < max_retry_count
      log_transient_error e
      retry_count += 1
      sleep retry_count * 0.3
      retry
    else
      log_retries_exhausted e
      msg = "Unexpected error: #{e.inspect}"
      raise Google::Auth::AuthorizationError.with_details(
        msg,
        credential_type_name: self.class.name,
        principal: respond_to?(:principal) ? principal : :signet_client
      )
    end
  end
end

#token_typeObject

The token type as symbol, either :id_token or :access_token



65
66
67
# File 'lib/googleauth/signet.rb', line 65

def token_type
  target_audience ? :id_token : :access_token
end

#update!(options = {}) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/googleauth/signet.rb', line 43

def update! options = {}
  # Normalize all keys to symbols to allow indifferent access.
  options = deep_hash_normalize options

  # This `update!` method "overide" adds the `@logger`` update and
  # the `universe_domain` update.
  #
  # The `universe_domain` is also updated in `update_token!` but is
  # included here for completeness
  self.universe_domain = options[:universe_domain] if options.key? :universe_domain
  @logger = options[:logger] if options.key? :logger

  update_signet_base options
end

#update_signet_baseObject



42
# File 'lib/googleauth/signet.rb', line 42

alias update_signet_base update!

#update_token!(options = {}) ⇒ Object



33
34
35
36
37
38
39
40
# File 'lib/googleauth/signet.rb', line 33

def update_token! options = {}
  options = deep_hash_normalize options
  id_token_expires_at = expires_at_from_id_token options[:id_token]
  options[:expires_at] = id_token_expires_at if id_token_expires_at
  update_token_signet_base options
  self.universe_domain = options[:universe_domain] if options.key? :universe_domain
  self
end

#update_token_signet_baseObject



31
# File 'lib/googleauth/signet.rb', line 31

alias update_token_signet_base update_token!