From 95e73e66a088926dcf866895aaa64e4a6126dd93 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Mon, 29 Apr 2019 14:57:07 +0200 Subject: [PATCH] oauth2: correctly populate token expiry data * Populate the field when needed * Convert it to a time instead of a duration --- internal/services/configstore/api/user.go | 68 ++++--- .../services/configstore/command/command.go | 62 +++--- internal/services/gateway/command/user.go | 178 ++++++++++-------- internal/services/types/types.go | 6 +- 4 files changed, 169 insertions(+), 145 deletions(-) diff --git a/internal/services/configstore/api/user.go b/internal/services/configstore/api/user.go index f8ebffd..451755b 100644 --- a/internal/services/configstore/api/user.go +++ b/internal/services/configstore/api/user.go @@ -18,6 +18,7 @@ import ( "encoding/json" "net/http" "strconv" + "time" "github.com/pkg/errors" "github.com/sorintlab/agola/internal/db" @@ -130,12 +131,13 @@ func (h *CreateUserHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } if req.CreateUserLARequest != nil { creq.CreateUserLARequest = &command.CreateUserLARequest{ - RemoteSourceName: req.CreateUserLARequest.RemoteSourceName, - RemoteUserID: req.CreateUserLARequest.RemoteUserID, - RemoteUserName: req.CreateUserLARequest.RemoteUserName, - Oauth2AccessToken: req.CreateUserLARequest.Oauth2AccessToken, - Oauth2RefreshToken: req.CreateUserLARequest.Oauth2RefreshToken, - UserAccessToken: req.CreateUserLARequest.UserAccessToken, + RemoteSourceName: req.CreateUserLARequest.RemoteSourceName, + RemoteUserID: req.CreateUserLARequest.RemoteUserID, + RemoteUserName: req.CreateUserLARequest.RemoteUserName, + UserAccessToken: req.CreateUserLARequest.UserAccessToken, + Oauth2AccessToken: req.CreateUserLARequest.Oauth2AccessToken, + Oauth2RefreshToken: req.CreateUserLARequest.Oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: req.CreateUserLARequest.Oauth2AccessTokenExpiresAt, } } @@ -299,12 +301,13 @@ func (h *UsersHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } type CreateUserLARequest struct { - RemoteSourceName string `json:"remote_source_name"` - RemoteUserID string `json:"remote_user_id"` - RemoteUserName string `json:"remote_user_name"` - UserAccessToken string `json:"user_access_token"` - Oauth2AccessToken string `json:"oauth2_access_token"` - Oauth2RefreshToken string `json:"oauth2_refresh_token"` + RemoteSourceName string `json:"remote_source_name"` + RemoteUserID string `json:"remote_user_id"` + RemoteUserName string `json:"remote_user_name"` + UserAccessToken string `json:"user_access_token"` + Oauth2AccessToken string `json:"oauth2_access_token"` + Oauth2RefreshToken string `json:"oauth2_refresh_token"` + Oauth2AccessTokenExpiresAt time.Time `json:"oauth_2_access_token_expires_at"` } type CreateUserLAHandler struct { @@ -329,13 +332,14 @@ func (h *CreateUserLAHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) } creq := &command.CreateUserLARequest{ - UserName: userName, - RemoteSourceName: req.RemoteSourceName, - RemoteUserID: req.RemoteUserID, - RemoteUserName: req.RemoteUserName, - Oauth2AccessToken: req.Oauth2AccessToken, - Oauth2RefreshToken: req.Oauth2RefreshToken, - UserAccessToken: req.UserAccessToken, + UserName: userName, + RemoteSourceName: req.RemoteSourceName, + RemoteUserID: req.RemoteUserID, + RemoteUserName: req.RemoteUserName, + UserAccessToken: req.UserAccessToken, + Oauth2AccessToken: req.Oauth2AccessToken, + Oauth2RefreshToken: req.Oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: req.Oauth2AccessTokenExpiresAt, } user, err := h.ch.CreateUserLA(ctx, creq) if httpError(w, err) { @@ -373,11 +377,12 @@ func (h *DeleteUserLAHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) } type UpdateUserLARequest struct { - RemoteUserID string `json:"remote_user_id"` - RemoteUserName string `json:"remote_user_name"` - UserAccessToken string `json:"user_access_token"` - Oauth2AccessToken string `json:"oauth2_access_token"` - Oauth2RefreshToken string `json:"oauth2_refresh_token"` + RemoteUserID string `json:"remote_user_id"` + RemoteUserName string `json:"remote_user_name"` + UserAccessToken string `json:"user_access_token"` + Oauth2AccessToken string `json:"oauth2_access_token"` + Oauth2RefreshToken string `json:"oauth2_refresh_token"` + Oauth2AccessTokenExpiresAt time.Time `json:"oauth_2_access_token_expires_at"` } type UpdateUserLAHandler struct { @@ -403,13 +408,14 @@ func (h *UpdateUserLAHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) } creq := &command.UpdateUserLARequest{ - UserName: userName, - LinkedAccountID: linkedAccountID, - RemoteUserID: req.RemoteUserID, - RemoteUserName: req.RemoteUserName, - Oauth2AccessToken: req.Oauth2AccessToken, - Oauth2RefreshToken: req.Oauth2RefreshToken, - UserAccessToken: req.UserAccessToken, + UserName: userName, + LinkedAccountID: linkedAccountID, + RemoteUserID: req.RemoteUserID, + RemoteUserName: req.RemoteUserName, + UserAccessToken: req.UserAccessToken, + Oauth2AccessToken: req.Oauth2AccessToken, + Oauth2RefreshToken: req.Oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: req.Oauth2AccessTokenExpiresAt, } user, err := h.ch.UpdateUserLA(ctx, creq) if httpError(w, err) { diff --git a/internal/services/configstore/command/command.go b/internal/services/configstore/command/command.go index 1918bfb..6542d82 100644 --- a/internal/services/configstore/command/command.go +++ b/internal/services/configstore/command/command.go @@ -18,6 +18,7 @@ import ( "context" "encoding/json" "path" + "time" "github.com/sorintlab/agola/internal/datamanager" "github.com/sorintlab/agola/internal/db" @@ -309,13 +310,14 @@ func (s *CommandHandler) CreateUser(ctx context.Context, req *CreateUserRequest) } la := &types.LinkedAccount{ - ID: uuid.NewV4().String(), - RemoteSourceID: rs.ID, - RemoteUserID: req.CreateUserLARequest.RemoteUserID, - RemoteUserName: req.CreateUserLARequest.RemoteUserName, - UserAccessToken: req.CreateUserLARequest.UserAccessToken, - Oauth2AccessToken: req.CreateUserLARequest.Oauth2AccessToken, - Oauth2RefreshToken: req.CreateUserLARequest.Oauth2RefreshToken, + ID: uuid.NewV4().String(), + RemoteSourceID: rs.ID, + RemoteUserID: req.CreateUserLARequest.RemoteUserID, + RemoteUserName: req.CreateUserLARequest.RemoteUserName, + UserAccessToken: req.CreateUserLARequest.UserAccessToken, + Oauth2AccessToken: req.CreateUserLARequest.Oauth2AccessToken, + Oauth2RefreshToken: req.CreateUserLARequest.Oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: req.CreateUserLARequest.Oauth2AccessTokenExpiresAt, } user.LinkedAccounts[la.ID] = la @@ -400,13 +402,14 @@ func (s *CommandHandler) DeleteUser(ctx context.Context, userName string) error } type CreateUserLARequest struct { - UserName string - RemoteSourceName string - RemoteUserID string - RemoteUserName string - UserAccessToken string - Oauth2AccessToken string - Oauth2RefreshToken string + UserName string + RemoteSourceName string + RemoteUserID string + RemoteUserName string + UserAccessToken string + Oauth2AccessToken string + Oauth2RefreshToken string + Oauth2AccessTokenExpiresAt time.Time } func (s *CommandHandler) CreateUserLA(ctx context.Context, req *CreateUserLARequest) (*types.LinkedAccount, error) { @@ -466,13 +469,14 @@ func (s *CommandHandler) CreateUserLA(ctx context.Context, req *CreateUserLARequ } la := &types.LinkedAccount{ - ID: uuid.NewV4().String(), - RemoteSourceID: rs.ID, - RemoteUserID: req.RemoteUserID, - RemoteUserName: req.RemoteUserName, - UserAccessToken: req.UserAccessToken, - Oauth2AccessToken: req.Oauth2AccessToken, - Oauth2RefreshToken: req.Oauth2RefreshToken, + ID: uuid.NewV4().String(), + RemoteSourceID: rs.ID, + RemoteUserID: req.RemoteUserID, + RemoteUserName: req.RemoteUserName, + UserAccessToken: req.UserAccessToken, + Oauth2AccessToken: req.Oauth2AccessToken, + Oauth2RefreshToken: req.Oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: req.Oauth2AccessTokenExpiresAt, } user.LinkedAccounts[la.ID] = la @@ -555,13 +559,14 @@ func (s *CommandHandler) DeleteUserLA(ctx context.Context, userName, laID string } type UpdateUserLARequest struct { - UserName string - LinkedAccountID string - RemoteUserID string - RemoteUserName string - UserAccessToken string - Oauth2AccessToken string - Oauth2RefreshToken string + UserName string + LinkedAccountID string + RemoteUserID string + RemoteUserName string + UserAccessToken string + Oauth2AccessToken string + Oauth2RefreshToken string + Oauth2AccessTokenExpiresAt time.Time } func (s *CommandHandler) UpdateUserLA(ctx context.Context, req *UpdateUserLARequest) (*types.LinkedAccount, error) { @@ -617,6 +622,7 @@ func (s *CommandHandler) UpdateUserLA(ctx context.Context, req *UpdateUserLARequ la.UserAccessToken = req.UserAccessToken la.Oauth2AccessToken = req.Oauth2AccessToken la.Oauth2RefreshToken = req.Oauth2RefreshToken + la.Oauth2AccessTokenExpiresAt = req.Oauth2AccessTokenExpiresAt userj, err := json.Marshal(user) if err != nil { diff --git a/internal/services/gateway/command/user.go b/internal/services/gateway/command/user.go index cc081aa..d1a3e3a 100644 --- a/internal/services/gateway/command/user.go +++ b/internal/services/gateway/command/user.go @@ -17,6 +17,7 @@ package command import ( "context" "encoding/json" + "time" gitsource "github.com/sorintlab/agola/internal/gitsources" csapi "github.com/sorintlab/agola/internal/services/configstore/api" @@ -100,11 +101,12 @@ func (c *CommandHandler) CreateUserToken(ctx context.Context, req *CreateUserTok } type CreateUserLARequest struct { - UserName string - RemoteSourceName string - RemoteSourceUserAccessToken string - RemoteSourceOauth2AccessToken string - RemoteSourceOauth2RefreshToken string + UserName string + RemoteSourceName string + UserAccessToken string + Oauth2AccessToken string + Oauth2RefreshToken string + Oauth2AccessTokenExpiresAt time.Time } func (c *CommandHandler) CreateUserLA(ctx context.Context, req *CreateUserLARequest) (*types.LinkedAccount, error) { @@ -130,7 +132,7 @@ func (c *CommandHandler) CreateUserLA(ctx context.Context, req *CreateUserLARequ return nil, util.NewErrBadRequest(errors.Errorf("user %q already have a linked account for remote source %q", userName, rs.Name)) } - accessToken, err := common.GetAccessToken(rs.AuthType, req.RemoteSourceUserAccessToken, req.RemoteSourceOauth2AccessToken) + accessToken, err := common.GetAccessToken(rs.AuthType, req.UserAccessToken, req.Oauth2AccessToken) if err != nil { return nil, err } @@ -148,12 +150,13 @@ func (c *CommandHandler) CreateUserLA(ctx context.Context, req *CreateUserLARequ } creq := &csapi.CreateUserLARequest{ - RemoteSourceName: req.RemoteSourceName, - RemoteUserID: remoteUserInfo.ID, - RemoteUserName: remoteUserInfo.LoginName, - Oauth2AccessToken: req.RemoteSourceOauth2AccessToken, - Oauth2RefreshToken: req.RemoteSourceOauth2RefreshToken, - UserAccessToken: req.RemoteSourceUserAccessToken, + RemoteSourceName: req.RemoteSourceName, + RemoteUserID: remoteUserInfo.ID, + RemoteUserName: remoteUserInfo.LoginName, + UserAccessToken: req.UserAccessToken, + Oauth2AccessToken: req.Oauth2AccessToken, + Oauth2RefreshToken: req.Oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: req.Oauth2AccessTokenExpiresAt, } c.log.Infof("creating linked account") @@ -167,11 +170,12 @@ func (c *CommandHandler) CreateUserLA(ctx context.Context, req *CreateUserLARequ } type RegisterUserRequest struct { - UserName string - RemoteSourceName string - RemoteSourceUserAccessToken string - RemoteSourceOauth2AccessToken string - RemoteSourceOauth2RefreshToken string + UserName string + RemoteSourceName string + UserAccessToken string + Oauth2AccessToken string + Oauth2RefreshToken string + Oauth2AccessTokenExpiresAt time.Time } func (c *CommandHandler) RegisterUser(ctx context.Context, req *RegisterUserRequest) (*types.User, error) { @@ -188,7 +192,7 @@ func (c *CommandHandler) RegisterUser(ctx context.Context, req *RegisterUserRequ } c.log.Infof("rs: %s", util.Dump(rs)) - accessToken, err := common.GetAccessToken(rs.AuthType, req.RemoteSourceUserAccessToken, req.RemoteSourceOauth2AccessToken) + accessToken, err := common.GetAccessToken(rs.AuthType, req.UserAccessToken, req.Oauth2AccessToken) if err != nil { return nil, err } @@ -208,12 +212,13 @@ func (c *CommandHandler) RegisterUser(ctx context.Context, req *RegisterUserRequ creq := &csapi.CreateUserRequest{ UserName: req.UserName, CreateUserLARequest: &csapi.CreateUserLARequest{ - RemoteSourceName: req.RemoteSourceName, - RemoteUserID: remoteUserInfo.ID, - RemoteUserName: remoteUserInfo.LoginName, - Oauth2AccessToken: req.RemoteSourceOauth2AccessToken, - Oauth2RefreshToken: req.RemoteSourceOauth2RefreshToken, - UserAccessToken: req.RemoteSourceUserAccessToken, + RemoteSourceName: req.RemoteSourceName, + RemoteUserID: remoteUserInfo.ID, + RemoteUserName: remoteUserInfo.LoginName, + UserAccessToken: req.UserAccessToken, + Oauth2AccessToken: req.Oauth2AccessToken, + Oauth2RefreshToken: req.Oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: req.Oauth2AccessTokenExpiresAt, }, } @@ -228,10 +233,11 @@ func (c *CommandHandler) RegisterUser(ctx context.Context, req *RegisterUserRequ } type LoginUserRequest struct { - RemoteSourceName string - RemoteSourceUserAccessToken string - RemoteSourceOauth2AccessToken string - RemoteSourceOauth2RefreshToken string + RemoteSourceName string + UserAccessToken string + Oauth2AccessToken string + Oauth2RefreshToken string + Oauth2AccessTokenExpiresAt time.Time } type LoginUserResponse struct { @@ -246,7 +252,7 @@ func (c *CommandHandler) LoginUser(ctx context.Context, req *LoginUserRequest) ( } c.log.Infof("rs: %s", util.Dump(rs)) - accessToken, err := common.GetAccessToken(rs.AuthType, req.RemoteSourceUserAccessToken, req.RemoteSourceOauth2AccessToken) + accessToken, err := common.GetAccessToken(rs.AuthType, req.UserAccessToken, req.Oauth2AccessToken) if err != nil { return nil, err } @@ -281,20 +287,21 @@ func (c *CommandHandler) LoginUser(ctx context.Context, req *LoginUserRequest) ( } // Update oauth tokens if they have changed since the getuserinfo request may have updated them - if la.Oauth2AccessToken != req.RemoteSourceOauth2AccessToken || - la.Oauth2RefreshToken != req.RemoteSourceOauth2RefreshToken || - la.UserAccessToken != req.RemoteSourceUserAccessToken { + if la.Oauth2AccessToken != req.Oauth2AccessToken || + la.Oauth2RefreshToken != req.Oauth2RefreshToken || + la.UserAccessToken != req.UserAccessToken { - la.Oauth2AccessToken = req.RemoteSourceOauth2AccessToken - la.Oauth2RefreshToken = req.RemoteSourceOauth2RefreshToken - la.UserAccessToken = req.RemoteSourceUserAccessToken + la.Oauth2AccessToken = req.Oauth2AccessToken + la.Oauth2RefreshToken = req.Oauth2RefreshToken + la.UserAccessToken = req.UserAccessToken creq := &csapi.UpdateUserLARequest{ - RemoteUserID: la.RemoteUserID, - RemoteUserName: la.RemoteUserName, - Oauth2AccessToken: la.Oauth2AccessToken, - Oauth2RefreshToken: la.Oauth2RefreshToken, - UserAccessToken: la.UserAccessToken, + RemoteUserID: la.RemoteUserID, + RemoteUserName: la.RemoteUserName, + UserAccessToken: la.UserAccessToken, + Oauth2AccessToken: la.Oauth2AccessToken, + Oauth2RefreshToken: la.Oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: la.Oauth2AccessTokenExpiresAt, } c.log.Infof("updating user %q linked account", user.UserName) @@ -317,10 +324,11 @@ func (c *CommandHandler) LoginUser(ctx context.Context, req *LoginUserRequest) ( } type AuthorizeRequest struct { - RemoteSourceName string - RemoteSourceUserAccessToken string - RemoteSourceOauth2AccessToken string - RemoteSourceOauth2RefreshToken string + RemoteSourceName string + UserAccessToken string + Oauth2AccessToken string + Oauth2RefreshToken string + Oauth2AccessTokenExpiresAt time.Time } type AuthorizeResponse struct { @@ -335,7 +343,7 @@ func (c *CommandHandler) Authorize(ctx context.Context, req *AuthorizeRequest) ( } c.log.Infof("rs: %s", util.Dump(rs)) - accessToken, err := common.GetAccessToken(rs.AuthType, req.RemoteSourceUserAccessToken, req.RemoteSourceOauth2AccessToken) + accessToken, err := common.GetAccessToken(rs.AuthType, req.UserAccessToken, req.Oauth2AccessToken) if err != nil { return nil, err } @@ -433,7 +441,7 @@ func (c *CommandHandler) HandleRemoteSourceAuth(ctx context.Context, remoteSourc if err != nil { return nil, err } - cres, err := c.HandleRemoteSourceAuthRequest(ctx, requestType, string(requestj), accessToken, "", "") + cres, err := c.HandleRemoteSourceAuthRequest(ctx, requestType, string(requestj), accessToken, "", "", time.Time{}) if err != nil { return nil, err } @@ -464,7 +472,7 @@ type CreateUserLAResponse struct { LinkedAccount *types.LinkedAccount } -func (c *CommandHandler) HandleRemoteSourceAuthRequest(ctx context.Context, requestType RemoteSourceRequestType, requestString string, userAccessToken, Oauth2AccessToken, Oauth2RefreshToken string) (*RemoteSourceAuthResult, error) { +func (c *CommandHandler) HandleRemoteSourceAuthRequest(ctx context.Context, requestType RemoteSourceRequestType, requestString string, userAccessToken, oauth2AccessToken, oauth2RefreshToken string, oauth2AccessTokenExpiresAt time.Time) (*RemoteSourceAuthResult, error) { switch requestType { case RemoteSourceRequestTypeCreateUserLA: var req *CreateUserLARequest @@ -473,11 +481,12 @@ func (c *CommandHandler) HandleRemoteSourceAuthRequest(ctx context.Context, requ } creq := &CreateUserLARequest{ - UserName: req.UserName, - RemoteSourceName: req.RemoteSourceName, - RemoteSourceUserAccessToken: userAccessToken, - RemoteSourceOauth2AccessToken: Oauth2AccessToken, - RemoteSourceOauth2RefreshToken: Oauth2RefreshToken, + UserName: req.UserName, + RemoteSourceName: req.RemoteSourceName, + UserAccessToken: userAccessToken, + Oauth2AccessToken: oauth2AccessToken, + Oauth2RefreshToken: oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: oauth2AccessTokenExpiresAt, } la, err := c.CreateUserLA(ctx, creq) if err != nil { @@ -490,6 +499,29 @@ func (c *CommandHandler) HandleRemoteSourceAuthRequest(ctx context.Context, requ }, }, nil + case RemoteSourceRequestTypeRegisterUser: + var req *RegisterUserRequest + if err := json.Unmarshal([]byte(requestString), &req); err != nil { + return nil, errors.Errorf("failed to unmarshal request") + } + + creq := &RegisterUserRequest{ + UserName: req.UserName, + RemoteSourceName: req.RemoteSourceName, + UserAccessToken: userAccessToken, + Oauth2AccessToken: oauth2AccessToken, + Oauth2RefreshToken: oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: oauth2AccessTokenExpiresAt, + } + cresp, err := c.RegisterUser(ctx, creq) + if err != nil { + return nil, err + } + return &RemoteSourceAuthResult{ + RequestType: requestType, + Response: cresp, + }, nil + case RemoteSourceRequestTypeLoginUser: var req *LoginUserRequest if err := json.Unmarshal([]byte(requestString), &req); err != nil { @@ -497,10 +529,11 @@ func (c *CommandHandler) HandleRemoteSourceAuthRequest(ctx context.Context, requ } creq := &LoginUserRequest{ - RemoteSourceName: req.RemoteSourceName, - RemoteSourceUserAccessToken: userAccessToken, - RemoteSourceOauth2AccessToken: Oauth2AccessToken, - RemoteSourceOauth2RefreshToken: Oauth2RefreshToken, + RemoteSourceName: req.RemoteSourceName, + UserAccessToken: userAccessToken, + Oauth2AccessToken: oauth2AccessToken, + Oauth2RefreshToken: oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: oauth2AccessTokenExpiresAt, } cresp, err := c.LoginUser(ctx, creq) if err != nil { @@ -518,10 +551,11 @@ func (c *CommandHandler) HandleRemoteSourceAuthRequest(ctx context.Context, requ } creq := &AuthorizeRequest{ - RemoteSourceName: req.RemoteSourceName, - RemoteSourceUserAccessToken: userAccessToken, - RemoteSourceOauth2AccessToken: Oauth2AccessToken, - RemoteSourceOauth2RefreshToken: Oauth2RefreshToken, + RemoteSourceName: req.RemoteSourceName, + UserAccessToken: userAccessToken, + Oauth2AccessToken: oauth2AccessToken, + Oauth2RefreshToken: oauth2RefreshToken, + Oauth2AccessTokenExpiresAt: oauth2AccessTokenExpiresAt, } cresp, err := c.Authorize(ctx, creq) if err != nil { @@ -532,28 +566,6 @@ func (c *CommandHandler) HandleRemoteSourceAuthRequest(ctx context.Context, requ Response: cresp, }, nil - case RemoteSourceRequestTypeRegisterUser: - var req *RegisterUserRequest - if err := json.Unmarshal([]byte(requestString), &req); err != nil { - return nil, errors.Errorf("failed to unmarshal request") - } - - creq := &RegisterUserRequest{ - UserName: req.UserName, - RemoteSourceName: req.RemoteSourceName, - RemoteSourceUserAccessToken: userAccessToken, - RemoteSourceOauth2AccessToken: Oauth2AccessToken, - RemoteSourceOauth2RefreshToken: Oauth2RefreshToken, - } - cresp, err := c.RegisterUser(ctx, creq) - if err != nil { - return nil, err - } - return &RemoteSourceAuthResult{ - RequestType: requestType, - Response: cresp, - }, nil - default: return nil, errors.Errorf("unknown request") } @@ -603,5 +615,5 @@ func (c *CommandHandler) HandleOauth2Callback(ctx context.Context, code, state s return nil, err } - return c.HandleRemoteSourceAuthRequest(ctx, requestType, requestString, "", oauth2Token.AccessToken, oauth2Token.RefreshToken) + return c.HandleRemoteSourceAuthRequest(ctx, requestType, requestString, "", oauth2Token.AccessToken, oauth2Token.RefreshToken, oauth2Token.Expiry) } diff --git a/internal/services/types/types.go b/internal/services/types/types.go index 0a08ea4..a3770ba 100644 --- a/internal/services/types/types.go +++ b/internal/services/types/types.go @@ -127,9 +127,9 @@ type LinkedAccount struct { UserAccessToken string `json:"user_access_token,omitempty"` - Oauth2AccessToken string `json:"oauth2_access_token,omitempty"` - Oauth2RefreshToken string `json:"oauth2_refresh_token,omitempty"` - Oauth2Expire time.Duration `json:"oauth2_expire,omitempty"` + Oauth2AccessToken string `json:"oauth2_access_token,omitempty"` + Oauth2RefreshToken string `json:"oauth2_refresh_token,omitempty"` + Oauth2AccessTokenExpiresAt time.Time `json:"oauth_2_access_token_expires_at,omitempty"` } type Project struct {