From 8c5579a3fbe7742131738bc58d21dc36a1731c2f Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 10 Jul 2023 23:24:10 +0000 Subject: [PATCH] fix: use `expires_in` field for git device refresh This was causing git auth to never refresh after the token became expired after 8hrs. --- coderd/gitauth/oauth.go | 12 ++++++++++-- coderd/gitauth_test.go | 4 +--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/coderd/gitauth/oauth.go b/coderd/gitauth/oauth.go index 1e0748da91fc2..daba6a8faf075 100644 --- a/coderd/gitauth/oauth.go +++ b/coderd/gitauth/oauth.go @@ -6,11 +6,13 @@ import ( "net/http" "net/url" "regexp" + "time" "golang.org/x/oauth2" "golang.org/x/oauth2/github" "golang.org/x/xerrors" + "github.com/coder/coder/coderd/database" "github.com/coder/coder/codersdk" ) @@ -138,7 +140,9 @@ func (c *DeviceAuth) AuthorizeDevice(ctx context.Context) (*codersdk.GitAuthDevi } type ExchangeDeviceCodeResponse struct { - *oauth2.Token + AccessToken string `json:"access_token"` + RefreshToken string `json:"refresh_token"` + ExpiresIn int `json:"expires_in"` Error string `json:"error"` ErrorDescription string `json:"error_description"` } @@ -175,7 +179,11 @@ func (c *DeviceAuth) ExchangeDeviceCode(ctx context.Context, deviceCode string) if body.Error != "" { return nil, xerrors.New(body.Error) } - return body.Token, nil + return &oauth2.Token{ + AccessToken: body.AccessToken, + RefreshToken: body.RefreshToken, + Expiry: database.Now().Add(time.Duration(body.ExpiresIn) * time.Second), + }, nil } func (c *DeviceAuth) formatDeviceTokenURL(deviceCode string) (string, error) { diff --git a/coderd/gitauth_test.go b/coderd/gitauth_test.go index 9d102aa2150f8..578f7bea145c5 100644 --- a/coderd/gitauth_test.go +++ b/coderd/gitauth_test.go @@ -200,9 +200,7 @@ func TestGitAuthDevice(t *testing.T) { require.Equal(t, "authorization_pending", sdkErr.Detail) resp = gitauth.ExchangeDeviceCodeResponse{ - Token: &oauth2.Token{ - AccessToken: "hey", - }, + AccessToken: "hey", } err = client.GitAuthDeviceExchange(context.Background(), "test", codersdk.GitAuthDeviceExchange{