From 1b133edd78c85e38701a4405c3639e9cd15f7994 Mon Sep 17 00:00:00 2001 From: Donovan Date: Tue, 24 Sep 2024 16:56:14 -0500 Subject: [PATCH] implement Email as username --- core/customer_test.go | 8 ++++---- core/in_memory_db.go | 12 ++++++------ core/nkode_api.go | 24 ++++++++++++------------ core/nkode_api_test.go | 12 ++++++------ core/nkode_handler.go | 17 +++++++++++++---- core/sqlite_db.go | 9 +++++---- core/sqlite_db_test.go | 4 ++-- core/type.go | 31 +++++++++++++++++++++---------- core/user.go | 10 +++++++--- core/user_signup_session.go | 8 ++++---- main_test.go | 18 +++++++++--------- 11 files changed, 89 insertions(+), 64 deletions(-) diff --git a/core/customer_test.go b/core/customer_test.go index a38d887..610bb0d 100644 --- a/core/customer_test.go +++ b/core/customer_test.go @@ -24,9 +24,9 @@ func testCustomerValidKeyEntry(t *testing.T) { mockSvgInterface := make(SvgIdInterface, kp.TotalAttrs()) userInterface, err := NewUserInterface(&kp, mockSvgInterface) assert.NoError(t, err) - username := Username("testing123") + userEmail := "testing@example.com" passcodeIdx := []int{0, 1, 2, 3} - user, err := NewUser(*customer, username, passcodeIdx, *userInterface, kp) + user, err := NewUser(*customer, userEmail, passcodeIdx, *userInterface, kp) assert.NoError(t, err) userLoginInterface, err := user.GetLoginInterface() assert.NoError(t, err) @@ -48,9 +48,9 @@ func testCustomerIsValidNKode(t *testing.T) { mockSvgInterface := make(SvgIdInterface, kp.TotalAttrs()) userInterface, err := NewUserInterface(&kp, mockSvgInterface) assert.NoError(t, err) - username := Username("testing123") + userEmail := "testing123@example.com" passcodeIdx := []int{0, 1, 2, 3} - user, err := NewUser(*customer, username, passcodeIdx, *userInterface, kp) + user, err := NewUser(*customer, userEmail, passcodeIdx, *userInterface, kp) assert.NoError(t, err) err = customer.IsValidNKode(user.Kp, passcodeIdx) assert.NoError(t, err) diff --git a/core/in_memory_db.go b/core/in_memory_db.go index dbd0c76..9963240 100644 --- a/core/in_memory_db.go +++ b/core/in_memory_db.go @@ -27,7 +27,7 @@ func (db *InMemoryDb) GetCustomer(id CustomerId) (*Customer, error) { return &customer, nil } -func (db *InMemoryDb) GetUser(username Username, customerId CustomerId) (*User, error) { +func (db *InMemoryDb) GetUser(username Email, customerId CustomerId) (*User, error) { key := userIdKey(customerId, username) userId, exists := db.userIdMap[key] if !exists { @@ -53,14 +53,14 @@ func (db *InMemoryDb) WriteNewCustomer(customer Customer) error { func (db *InMemoryDb) WriteNewUser(user User) error { _, exists := db.Customers[user.CustomerId] if !exists { - return errors.New(fmt.Sprintf("can't add user %s to customer %s: customer dne", user.Username, user.CustomerId)) + return errors.New(fmt.Sprintf("can't add user %s to customer %s: customer dne", user.Email, user.CustomerId)) } - userExists, _ := db.GetUser(user.Username, user.CustomerId) + userExists, _ := db.GetUser(user.Email, user.CustomerId) if userExists != nil { - return errors.New(fmt.Sprintf("can't write new user %s, alread exists", user.Username)) + return errors.New(fmt.Sprintf("can't write new user %s, alread exists", user.Email)) } - key := userIdKey(user.CustomerId, user.Username) + key := userIdKey(user.CustomerId, user.Email) db.userIdMap[key] = user.Id db.Users[user.Id] = user return nil @@ -125,7 +125,7 @@ func (db *InMemoryDb) GetSvgStringInterface(idxs SvgIdInterface) ([]string, erro return make([]string, len(idxs)), nil } -func userIdKey(customerId CustomerId, username Username) string { +func userIdKey(customerId CustomerId, username Email) string { key := fmt.Sprintf("%s:%s", customerId, username) return key } diff --git a/core/nkode_api.go b/core/nkode_api.go index 41c343c..95a651a 100644 --- a/core/nkode_api.go +++ b/core/nkode_api.go @@ -34,12 +34,12 @@ func (n *NKodeAPI) CreateNewCustomer(nkodePolicy NKodePolicy, id *CustomerId) (* return &newCustomer.Id, nil } -func (n *NKodeAPI) GenerateSignupInterface(username Username, customerId CustomerId, kp KeypadDimension) (*GenerateSignupInterfaceResp, error) { +func (n *NKodeAPI) GenerateSignupInterface(userEmail Email, customerId CustomerId, kp KeypadDimension) (*GenerateSignupInterfaceResp, error) { svgIdxInterface, err := n.Db.RandomSvgIdxInterface(kp) if err != nil { return nil, err } - signupSession, err := NewSignupSession(username, kp, customerId, svgIdxInterface) + signupSession, err := NewSignupSession(userEmail, kp, customerId, svgIdxInterface) if err != nil { return nil, err } @@ -91,7 +91,7 @@ func (n *NKodeAPI) ConfirmNKode(customerId CustomerId, sessionId SessionId, keyS if err != nil { return err } - user, err := NewUser(*customer, session.Username, passcode, session.LoginUserInterface, session.Kp) + user, err := NewUser(*customer, string(session.UserEmail), passcode, session.LoginUserInterface, session.Kp) if err != nil { return err } @@ -100,8 +100,8 @@ func (n *NKodeAPI) ConfirmNKode(customerId CustomerId, sessionId SessionId, keyS return err } -func (n *NKodeAPI) GetLoginInterface(username Username, customerId CustomerId) (*GetLoginInterfaceResp, error) { - user, err := n.Db.GetUser(username, customerId) +func (n *NKodeAPI) GetLoginInterface(userEmail Email, customerId CustomerId) (*GetLoginInterfaceResp, error) { + user, err := n.Db.GetUser(userEmail, customerId) if err != nil { return nil, err } @@ -126,14 +126,14 @@ func (n *NKodeAPI) GetLoginInterface(username Username, customerId CustomerId) ( return &resp, nil } -func (n *NKodeAPI) Login(customerId CustomerId, username Username, keySelection KeySelection) (*JwtTokens, error) { +func (n *NKodeAPI) Login(customerId CustomerId, userEmail Email, keySelection KeySelection) (*JwtTokens, error) { customer, err := n.Db.GetCustomer(customerId) if err != nil { return nil, err } - user, err := n.Db.GetUser(username, customerId) + user, err := n.Db.GetUser(userEmail, customerId) if err != nil { - return nil, errors.New(fmt.Sprintf("user dne %s", username)) + return nil, errors.New(fmt.Sprintf("user dne %s", userEmail)) } passcode, err := ValidKeyEntry(*user, *customer, keySelection) if err != nil { @@ -146,7 +146,7 @@ func (n *NKodeAPI) Login(customerId CustomerId, username Username, keySelection return nil, err } } - jwtToken, err := NewJwtTokens(string(user.Username)) + jwtToken, err := NewJwtTokens(string(user.Email)) if err != nil { return nil, err } @@ -169,8 +169,8 @@ func (n *NKodeAPI) GetSvgStringInterface(svgId SvgIdInterface) ([]string, error) return n.Db.GetSvgStringInterface(svgId) } -func (n *NKodeAPI) RefreshToken(username Username, customerId CustomerId, refreshToken string) (string, error) { - user, err := n.Db.GetUser(username, customerId) +func (n *NKodeAPI) RefreshToken(userEmail Email, customerId CustomerId, refreshToken string) (string, error) { + user, err := n.Db.GetUser(userEmail, customerId) if err != nil { return "", err } @@ -184,6 +184,6 @@ func (n *NKodeAPI) RefreshToken(username Username, customerId CustomerId, refres if err = ClaimExpired(*refreshClaims); err != nil { return "", err } - newAccessClaims := NewAccessClaim(string(username)) + newAccessClaims := NewAccessClaim(string(userEmail)) return EncodeAndSignClaims(newAccessClaims) } diff --git a/core/nkode_api_test.go b/core/nkode_api_test.go index 5ea15cf..f324ff5 100644 --- a/core/nkode_api_test.go +++ b/core/nkode_api_test.go @@ -28,14 +28,14 @@ func testNKodeAPI(t *testing.T, db DbAccessor) { attrsPerKey := 5 numbOfKeys := 4 for idx := 0; idx < 1; idx++ { - username := Username("test_username" + util.GenerateRandomString(12)) + userEmail := Email("test_username" + util.GenerateRandomString(12) + "@example.com") passcodeLen := 4 nkodePolicy := NewDefaultNKodePolicy() keypadSize := KeypadDimension{AttrsPerKey: attrsPerKey, NumbOfKeys: numbOfKeys} nkodeApi := NewNKodeAPI(db) customerId, err := nkodeApi.CreateNewCustomer(nkodePolicy, nil) assert.NoError(t, err) - signupResponse, err := nkodeApi.GenerateSignupInterface(username, *customerId, keypadSize) + signupResponse, err := nkodeApi.GenerateSignupInterface(userEmail, *customerId, keypadSize) assert.NoError(t, err) setInterface := signupResponse.UserIdxInterface sessionIdStr := signupResponse.SessionId @@ -52,21 +52,21 @@ func testNKodeAPI(t *testing.T, db DbAccessor) { assert.NoError(t, err) keypadSize = KeypadDimension{AttrsPerKey: attrsPerKey, NumbOfKeys: numbOfKeys} - loginInterface, err := nkodeApi.GetLoginInterface(username, *customerId) + loginInterface, err := nkodeApi.GetLoginInterface(userEmail, *customerId) assert.NoError(t, err) loginKeySelection, err := SelectKeyByAttrIdx(loginInterface.UserIdxInterface, userPasscode, keypadSize) assert.NoError(t, err) - _, err = nkodeApi.Login(*customerId, username, loginKeySelection) + _, err = nkodeApi.Login(*customerId, userEmail, loginKeySelection) assert.NoError(t, err) err = nkodeApi.RenewAttributes(*customerId) assert.NoError(t, err) - loginInterface, err = nkodeApi.GetLoginInterface(username, *customerId) + loginInterface, err = nkodeApi.GetLoginInterface(userEmail, *customerId) assert.NoError(t, err) loginKeySelection, err = SelectKeyByAttrIdx(loginInterface.UserIdxInterface, userPasscode, keypadSize) assert.NoError(t, err) - _, err = nkodeApi.Login(*customerId, username, loginKeySelection) + _, err = nkodeApi.Login(*customerId, userEmail, loginKeySelection) assert.NoError(t, err) } diff --git a/core/nkode_handler.go b/core/nkode_handler.go index 51846ac..6a915f9 100644 --- a/core/nkode_handler.go +++ b/core/nkode_handler.go @@ -118,7 +118,8 @@ func (h *NKodeHandler) GenerateSignupInterfaceHandler(w http.ResponseWriter, r * log.Println(err) return } - resp, err := h.Api.GenerateSignupInterface(signupPost.Username, CustomerId(customerId), kp) + userEmail, err := ParseEmail(signupPost.UserEmail) + resp, err := h.Api.GenerateSignupInterface(userEmail, CustomerId(customerId), kp) if err != nil { internalServerErrorHandler(w) log.Println(err) @@ -244,7 +245,8 @@ func (h *NKodeHandler) GetLoginInterfaceHandler(w http.ResponseWriter, r *http.R log.Println(err) return } - loginInterface, err := h.Api.GetLoginInterface(loginInterfacePost.Username, CustomerId(customerId)) + userEmail, err := ParseEmail(loginInterfacePost.UserEmail) + loginInterface, err := h.Api.GetLoginInterface(userEmail, CustomerId(customerId)) if err != nil { internalServerErrorHandler(w) log.Println(err) @@ -286,7 +288,8 @@ func (h *NKodeHandler) LoginHandler(w http.ResponseWriter, r *http.Request) { log.Println(err) return } - jwtTokens, err := h.Api.Login(CustomerId(customerId), loginPost.Username, loginPost.KeySelection) + userEmail, err := ParseEmail(loginPost.UserEmail) + jwtTokens, err := h.Api.Login(CustomerId(customerId), userEmail, loginPost.KeySelection) if err != nil { internalServerErrorHandler(w) log.Println(err) @@ -384,7 +387,13 @@ func (h *NKodeHandler) RefreshTokenHandler(w http.ResponseWriter, r *http.Reques log.Println(err) return } - accessToken, err := h.Api.RefreshToken(Username(refreshTokenPost.Username), CustomerId(customerId), refreshTokenPost.RefreshToken) + userEmail, err := ParseEmail(refreshTokenPost.UserEmail) + if err != nil { + internalServerErrorHandler(w) + log.Println(err) + return + } + accessToken, err := h.Api.RefreshToken(userEmail, CustomerId(customerId), refreshTokenPost.RefreshToken) if err != nil { internalServerErrorHandler(w) diff --git a/core/sqlite_db.go b/core/sqlite_db.go index 1265343..9f0f724 100644 --- a/core/sqlite_db.go +++ b/core/sqlite_db.go @@ -60,6 +60,7 @@ VALUES (?,?,?,?,?,?,?,?,?) } func (d *SqliteDB) WriteNewUser(u User) error { + tx, err := d.db.Begin() if err != nil { return err @@ -82,7 +83,7 @@ VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) } else { renew = 0 } - _, err = tx.Exec(insertUser, uuid.UUID(u.Id), u.Username, renew, u.RefreshToken, uuid.UUID(u.CustomerId), u.EncipheredPasscode.Code, u.EncipheredPasscode.Mask, u.Kp.AttrsPerKey, u.Kp.NumbOfKeys, util.Uint64ArrToByteArr(u.CipherKeys.AlphaKey), util.Uint64ArrToByteArr(u.CipherKeys.SetKey), util.Uint64ArrToByteArr(u.CipherKeys.PassKey), util.Uint64ArrToByteArr(u.CipherKeys.MaskKey), u.CipherKeys.Salt, u.CipherKeys.MaxNKodeLen, util.IntArrToByteArr(u.Interface.IdxInterface), util.IntArrToByteArr(u.Interface.SvgId)) + _, err = tx.Exec(insertUser, uuid.UUID(u.Id), u.Email, renew, u.RefreshToken, uuid.UUID(u.CustomerId), u.EncipheredPasscode.Code, u.EncipheredPasscode.Mask, u.Kp.AttrsPerKey, u.Kp.NumbOfKeys, util.Uint64ArrToByteArr(u.CipherKeys.AlphaKey), util.Uint64ArrToByteArr(u.CipherKeys.SetKey), util.Uint64ArrToByteArr(u.CipherKeys.PassKey), util.Uint64ArrToByteArr(u.CipherKeys.MaskKey), u.CipherKeys.Salt, u.CipherKeys.MaxNKodeLen, util.IntArrToByteArr(u.Interface.IdxInterface), util.IntArrToByteArr(u.Interface.SvgId)) if err != nil { return err @@ -134,7 +135,7 @@ func (d *SqliteDB) GetCustomer(id CustomerId) (*Customer, error) { return &customer, nil } -func (d *SqliteDB) GetUser(username Username, customerId CustomerId) (*User, error) { +func (d *SqliteDB) GetUser(username Email, customerId CustomerId) (*User, error) { userSelect := ` SELECT id, renew, refresh_token, code, mask, attributes_per_key, number_of_keys, alpha_key, set_key, pass_key, mask_key, salt, max_nkode_len, idx_interface, svg_id_interface FROM user WHERE user.username = ? AND user.customer_id = ? @@ -178,7 +179,7 @@ WHERE user.username = ? AND user.customer_id = ? user := User{ Id: UserId(userId), CustomerId: customerId, - Username: username, + Email: username, EncipheredPasscode: EncipheredNKode{ Code: code, Mask: mask, @@ -259,7 +260,7 @@ SELECT id, alpha_key, set_key, attributes_per_key, number_of_keys FROM user WHER user := User{ Id: UserId{}, CustomerId: CustomerId{}, - Username: "", + Email: "", EncipheredPasscode: EncipheredNKode{}, Kp: KeypadDimension{ AttrsPerKey: attrsPerKey, diff --git a/core/sqlite_db_test.go b/core/sqlite_db_test.go index 1d22bd6..ecc93c8 100644 --- a/core/sqlite_db_test.go +++ b/core/sqlite_db_test.go @@ -30,7 +30,7 @@ func testSignupLoginRenew(t *testing.T, db DbAccessor) { customer, err := db.GetCustomer(customerOrig.Id) assert.NoError(t, err) assert.Equal(t, customerOrig, customer) - username := Username("test_user") + username := "test_user@example.com" kp := KeypadDefault passcodeIdx := []int{0, 1, 2, 3} mockSvgInterface := make(SvgIdInterface, kp.TotalAttrs()) @@ -40,7 +40,7 @@ func testSignupLoginRenew(t *testing.T, db DbAccessor) { assert.NoError(t, err) err = db.WriteNewUser(*userOrig) assert.NoError(t, err) - user, err := db.GetUser(username, customer.Id) + user, err := db.GetUser(Email(username), customer.Id) assert.NoError(t, err) assert.Equal(t, userOrig, user) diff --git a/core/type.go b/core/type.go index bf27d6d..79120a6 100644 --- a/core/type.go +++ b/core/type.go @@ -2,6 +2,7 @@ package core import ( "github.com/google/uuid" + "net/mail" ) type SetNKodeResp struct { @@ -21,10 +22,10 @@ type NewCustomerPost struct { } type GenerateSignupInterfacePost struct { - CustomerId string `json:"customer_id"` - AttrsPerKey int `json:"attrs_per_key"` - NumbOfKeys int `json:"numb_of_keys"` - Username Username `json:"username"` + CustomerId string `json:"customer_id"` + AttrsPerKey int `json:"attrs_per_key"` + NumbOfKeys int `json:"numb_of_keys"` + UserEmail string `json:"email"` } type SetNKodePost struct { @@ -40,13 +41,13 @@ type ConfirmNKodePost struct { } type GetLoginInterfacePost struct { - Username Username `json:"username"` - CustomerId string `json:"customer_id"` + UserEmail string `json:"email"` + CustomerId string `json:"customer_id"` } type LoginPost struct { CustomerId string `json:"customer_id"` - Username Username `json:"username"` + UserEmail string `json:"email"` KeySelection KeySelection `json:"key_selection"` } @@ -55,7 +56,7 @@ type RenewAttributesPost struct { } type RefreshTokenPost struct { - Username string `json:"username"` + UserEmail string `json:"username"` CustomerId string `json:"customer_id"` RefreshToken string `json:"refresh_token"` } @@ -82,7 +83,17 @@ type CustomerId uuid.UUID type SessionId uuid.UUID type UserId uuid.UUID -type Username string +type Email string + +func ParseEmail(email string) (Email, error) { + _, err := mail.ParseAddress(email) + if err != nil { + return "", err + } + return Email(email), err + +} + type IdxInterface []int type SvgIdInterface []int @@ -102,7 +113,7 @@ type EncipheredNKode struct { type DbAccessor interface { GetCustomer(CustomerId) (*Customer, error) - GetUser(Username, CustomerId) (*User, error) + GetUser(Email, CustomerId) (*User, error) WriteNewCustomer(Customer) error WriteNewUser(User) error UpdateUserInterface(UserId, UserInterface) error diff --git a/core/user.go b/core/user.go index 4ffbe75..37dc813 100644 --- a/core/user.go +++ b/core/user.go @@ -10,7 +10,7 @@ import ( type User struct { Id UserId CustomerId CustomerId - Username Username + Email Email EncipheredPasscode EncipheredNKode Kp KeypadDimension CipherKeys UserCipherKeys @@ -117,7 +117,11 @@ func ValidKeyEntry(user User, customer Customer, selectedKeys []int) ([]int, err return presumedAttrIdxVals, nil } -func NewUser(customer Customer, username Username, passcodeIdx []int, ui UserInterface, kp KeypadDimension) (*User, error) { +func NewUser(customer Customer, userEmail string, passcodeIdx []int, ui UserInterface, kp KeypadDimension) (*User, error) { + _, err := ParseEmail(userEmail) + if err != nil { + return nil, err + } setVals, err := customer.Attributes.SetValsForKp(kp) if err != nil { return nil, err @@ -132,7 +136,7 @@ func NewUser(customer Customer, username Username, passcodeIdx []int, ui UserInt } newUser := User{ Id: UserId(uuid.New()), - Username: username, + Email: Email(userEmail), EncipheredPasscode: *encipheredNKode, CipherKeys: *newKeys, Interface: ui, diff --git a/core/user_signup_session.go b/core/user_signup_session.go index 830d00c..e5882c3 100644 --- a/core/user_signup_session.go +++ b/core/user_signup_session.go @@ -17,11 +17,11 @@ type UserSignSession struct { SetIdxInterface IdxInterface ConfirmIdxInterface IdxInterface SetKeySelection KeySelection - Username Username + UserEmail Email Expire int } -func NewSignupSession(username Username, kp KeypadDimension, customerId CustomerId, svgInterface SvgIdInterface) (*UserSignSession, error) { +func NewSignupSession(userEmail Email, kp KeypadDimension, customerId CustomerId, svgInterface SvgIdInterface) (*UserSignSession, error) { loginInterface, err := NewUserInterface(&kp, svgInterface) if err != nil { return nil, err @@ -37,7 +37,7 @@ func NewSignupSession(username Username, kp KeypadDimension, customerId Customer SetIdxInterface: signupInterface.IdxInterface, ConfirmIdxInterface: nil, SetKeySelection: nil, - Username: username, + UserEmail: userEmail, Kp: kp, } @@ -65,7 +65,7 @@ func (s *UserSignSession) DeducePasscode(confirmKeyEntry KeySelection) ([]int, e return nil, errors.New("signup session set key entry is nil") } - if s.Username == "" { + if s.UserEmail == "" { return nil, errors.New("signup session username is nil") } diff --git a/main_test.go b/main_test.go index 72f2c91..ad5f9e7 100644 --- a/main_test.go +++ b/main_test.go @@ -22,12 +22,12 @@ func TestApi(t *testing.T) { var customerResp core.CreateNewCustomerResp testApiPost(t, base+core.CreateNewCustomer, newCustomerBody, &customerResp) - username := core.Username("test_username") + username := "test_username@example.com" signupInterfaceBody := core.GenerateSignupInterfacePost{ CustomerId: customerResp.CustomerId, AttrsPerKey: kp.AttrsPerKey, NumbOfKeys: kp.NumbOfKeys, - Username: username, + UserEmail: username, } var signupInterfaceResp core.GenerateSignupInterfaceResp testApiPost(t, base+core.GenerateSignupInterface, signupInterfaceBody, &signupInterfaceResp) @@ -57,7 +57,7 @@ func TestApi(t *testing.T) { loginInterfaceBody := core.GetLoginInterfacePost{ CustomerId: customerResp.CustomerId, - Username: username, + UserEmail: username, } var loginInterfaceResp core.GetLoginInterfaceResp @@ -68,15 +68,15 @@ func TestApi(t *testing.T) { assert.NoError(t, err) loginBody := core.LoginPost{ CustomerId: customerResp.CustomerId, - Username: username, + UserEmail: username, KeySelection: loginKeySelection, } var jwtTokens core.JwtTokens testApiPost(t, base+core.Login, loginBody, &jwtTokens) refreshClaims, err := core.ParseRefreshToken(jwtTokens.RefreshToken) - assert.Equal(t, refreshClaims.Subject, string(username)) + assert.Equal(t, refreshClaims.Subject, username) accessClaims, err := core.ParseRefreshToken(jwtTokens.AccessToken) - assert.Equal(t, accessClaims.Subject, string(username)) + assert.Equal(t, accessClaims.Subject, username) renewBody := core.RenewAttributesPost{CustomerId: customerResp.CustomerId} testApiPost(t, base+core.RenewAttributes, renewBody, nil) @@ -84,7 +84,7 @@ func TestApi(t *testing.T) { assert.NoError(t, err) loginBody = core.LoginPost{ CustomerId: customerResp.CustomerId, - Username: username, + UserEmail: username, KeySelection: loginKeySelection, } @@ -95,7 +95,7 @@ func TestApi(t *testing.T) { assert.Equal(t, core.KeypadMax.TotalAttrs(), len(randomSvgInterfaceResp.Svgs)) refreshBody := core.RefreshTokenPost{ - Username: string(username), + UserEmail: username, CustomerId: customerResp.CustomerId, RefreshToken: jwtTokens.RefreshToken, } @@ -104,7 +104,7 @@ func TestApi(t *testing.T) { testApiPost(t, base+core.RefreshToken, refreshBody, &refreshTokenResp) accessClaims, err = core.ParseAccessToken(refreshTokenResp.AccessToken) assert.NoError(t, err) - assert.Equal(t, accessClaims.Subject, string(username)) + assert.Equal(t, accessClaims.Subject, username) } func Unmarshal(t *testing.T, resp *http.Response, data any) {