func TestNewRefreshToken(t *testing.T) { var ( client = &models.OauthClient{Model: gorm.Model{ID: 1}} user = &models.OauthUser{Model: gorm.Model{ID: 2}} refreshToken *models.OauthRefreshToken v driver.Value err error ) // When user object is nil refreshToken = models.NewOauthRefreshToken( client, // client nil, // user 1209600, // expires in "scope doesn't matter", // scope ) // refreshToken.ClientID.Valid should be true assert.True(t, refreshToken.ClientID.Valid) // refreshToken.ClientID.Value() should return the object id, in this case int64(1) v, err = refreshToken.ClientID.Value() assert.Nil(t, err) assert.Equal(t, int64(1), v) // refreshToken.UserID.Valid should be false assert.False(t, refreshToken.UserID.Valid) // refreshToken.UserID.Value() should return nil v, err = refreshToken.UserID.Value() assert.Nil(t, err) assert.Nil(t, v) // When user object is not nil refreshToken = models.NewOauthRefreshToken( client, // client user, // user 1209600, // expires in "scope doesn't matter", // scope ) // accessToken.ClientID.Valid should be true assert.True(t, refreshToken.ClientID.Valid) // accessToken.ClientID.Value() should return the object id, in this case int64(1) v, err = refreshToken.ClientID.Value() assert.Nil(t, err) assert.Equal(t, int64(1), v) // refreshToken.UserID.Valid should be true assert.True(t, refreshToken.UserID.Valid) // refreshToken.UserID.Value() should return the object id, in this case int64(2) v, err = refreshToken.UserID.Value() assert.Nil(t, err) assert.Equal(t, int64(2), v) }
// GetOrCreateRefreshToken retrieves an existing refresh token, if expired, // the token gets deleted and new refresh token is created func (s *Service) GetOrCreateRefreshToken(client *models.OauthClient, user *models.OauthUser, expiresIn int, scope string) (*models.OauthRefreshToken, error) { // Try to fetch an existing refresh token first refreshToken := new(models.OauthRefreshToken) query := models.OauthRefreshTokenPreload(s.db).Where("client_id = ?", client.ID) if user != nil && user.ID > 0 { query = query.Where("user_id = ?", user.ID) } else { query = query.Where("user_id IS NULL") } found := !query.First(refreshToken).RecordNotFound() // Check if the token is expired, if found var expired bool if found { expired = time.Now().UTC().After(refreshToken.ExpiresAt) } // If the refresh token has expired, delete it if expired { s.db.Unscoped().Delete(refreshToken) } // Create a new refresh token if it expired or was not found if expired || !found { refreshToken = models.NewOauthRefreshToken(client, user, expiresIn, scope) if err := s.db.Create(refreshToken).Error; err != nil { return nil, err } refreshToken.Client = client refreshToken.User = user } return refreshToken, nil }