From 6968da209b8fd816452d22ad1b4faca197a5b974 Mon Sep 17 00:00:00 2001 From: Sean Liao Date: Sat, 19 Apr 2025 11:28:47 +0100 Subject: [PATCH] oauth2: sync Token.ExpiresIn from internal Token The internal.Token type is intended to mirror the public Token type. Unmarshalling is sometimes done on the internal token. Sync the field addition, and update the conversion. Updates #61417 Fixes golang/oauth2#746 Change-Id: I55818810394adf743afb8d6d3be477a425c233b5 Reviewed-on: https://go-review.googlesource.com/c/oauth2/+/666815 LUCI-TryBot-Result: Go LUCI Reviewed-by: David Chase Reviewed-by: Matt Hickford Reviewed-by: Junyang Shao --- internal/token.go | 8 ++++++++ token.go | 1 + 2 files changed, 9 insertions(+) diff --git a/internal/token.go b/internal/token.go index a3460eb..17746d6 100644 --- a/internal/token.go +++ b/internal/token.go @@ -49,6 +49,13 @@ type Token struct { // mechanisms for that TokenSource will not be used. Expiry time.Time + // ExpiresIn is the OAuth2 wire format "expires_in" field, + // which specifies how many seconds later the token expires, + // relative to an unknown time base approximately around "now". + // It is the application's responsibility to populate + // `Expiry` from `ExpiresIn` when required. + ExpiresIn int64 `json:"expires_in,omitempty"` + // Raw optionally contains extra metadata from the server // when updating a token. Raw interface{} @@ -311,6 +318,7 @@ func doTokenRoundTrip(ctx context.Context, req *http.Request) (*Token, error) { TokenType: tj.TokenType, RefreshToken: tj.RefreshToken, Expiry: tj.expiry(), + ExpiresIn: int64(tj.ExpiresIn), Raw: make(map[string]interface{}), } json.Unmarshal(body, &token.Raw) // no error checks for optional fields diff --git a/token.go b/token.go index 8c31136..bb7545e 100644 --- a/token.go +++ b/token.go @@ -163,6 +163,7 @@ func tokenFromInternal(t *internal.Token) *Token { TokenType: t.TokenType, RefreshToken: t.RefreshToken, Expiry: t.Expiry, + ExpiresIn: t.ExpiresIn, raw: t.Raw, } }