lib/googleauth/signet.rb in googleauth-1.11.0 vs lib/googleauth/signet.rb in googleauth-1.11.1
- old
+ new
@@ -10,10 +10,12 @@
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
+require "base64"
+require "json"
require "signet/oauth_2/client"
require "googleauth/base_client"
module Signet
# OAuth2 supports OAuth2 authentication.
@@ -27,10 +29,12 @@
alias update_token_signet_base update_token!
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
@@ -86,9 +90,22 @@
else
msg = "Unexpected error: #{e.inspect}"
raise Signet::AuthorizationError, msg
end
end
+ end
+
+ private
+
+ def expires_at_from_id_token id_token
+ match = /^[\w=-]+\.([\w=-]+)\.[\w=-]+$/.match id_token.to_s
+ return unless match
+ json = JSON.parse Base64.urlsafe_decode64 match[1]
+ return unless json.key? "exp"
+ Time.at json["exp"].to_i
+ rescue StandardError
+ # Shouldn't happen unless we get a garbled ID token
+ nil
end
end
end
end