implement jwt claims

This commit is contained in:
2024-09-24 11:11:28 -05:00
parent f6e9ee7b1a
commit a7235941e7
5 changed files with 63 additions and 2 deletions

View File

@@ -86,7 +86,7 @@ func ClaimExpired(claims jwt.RegisteredClaims) error {
if claims.ExpiresAt == nil { if claims.ExpiresAt == nil {
return errors.New("claim exp is nil") return errors.New("claim exp is nil")
} }
if claims.ExpiresAt.Time.Before(time.Now()) { if claims.ExpiresAt.Time.After(time.Now()) {
return nil return nil
} }
return errors.New("claim expired") return errors.New("claim expired")

View File

@@ -21,7 +21,7 @@ const (
Login = "/login" Login = "/login"
RenewAttributes = "/renew-attributes" RenewAttributes = "/renew-attributes"
RandomSvgInterface = "/random-svg-interface" RandomSvgInterface = "/random-svg-interface"
RefreshToken = "refresh-token" RefreshToken = "/refresh-token"
) )
func (h *NKodeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (h *NKodeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@@ -367,7 +367,45 @@ func (h *NKodeHandler) RandomSvgInterfaceHandler(w http.ResponseWriter, r *http.
} }
func (h *NKodeHandler) RefreshTokenHandler(w http.ResponseWriter, r *http.Request) { func (h *NKodeHandler) RefreshTokenHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
methodNotAllowed(w)
}
var refreshTokenPost RefreshTokenPost
err := decodeJson(w, r, &refreshTokenPost)
if err != nil {
internalServerErrorHandler(w)
log.Println(err)
return
}
customerId, err := uuid.Parse(refreshTokenPost.CustomerId)
if err != nil {
internalServerErrorHandler(w)
log.Println(err)
return
}
accessToken, err := h.Api.RefreshToken(Username(refreshTokenPost.Username), CustomerId(customerId), refreshTokenPost.RefreshToken)
if err != nil {
internalServerErrorHandler(w)
log.Println(err)
return
}
respBytes, err := json.Marshal(RefreshTokenResp{AccessToken: accessToken})
if err != nil {
internalServerErrorHandler(w)
log.Println(err)
return
}
_, err = w.Write(respBytes)
if err != nil {
internalServerErrorHandler(w)
log.Println(err)
return
}
w.WriteHeader(http.StatusOK)
} }
func decodeJson(w http.ResponseWriter, r *http.Request, post any) error { func decodeJson(w http.ResponseWriter, r *http.Request, post any) error {

View File

@@ -12,6 +12,10 @@ type RandomSvgInterfaceResp struct {
Svgs []string `json:"svgs"` Svgs []string `json:"svgs"`
} }
type RefreshTokenResp struct {
AccessToken string `json:"access_token"`
}
type NewCustomerPost struct { type NewCustomerPost struct {
NKodePolicy NKodePolicy `json:"nkode_policy"` NKodePolicy NKodePolicy `json:"nkode_policy"`
} }
@@ -50,6 +54,12 @@ type RenewAttributesPost struct {
CustomerId string `json:"customer_id"` CustomerId string `json:"customer_id"`
} }
type RefreshTokenPost struct {
Username string `json:"username"`
CustomerId string `json:"customer_id"`
RefreshToken string `json:"refresh_token"`
}
type CreateNewCustomerResp struct { type CreateNewCustomerResp struct {
CustomerId string `json:"customer_id"` CustomerId string `json:"customer_id"`
} }

View File

@@ -23,6 +23,7 @@ func main() {
mux.Handle(core.Login, &handler) mux.Handle(core.Login, &handler)
mux.Handle(core.RenewAttributes, &handler) mux.Handle(core.RenewAttributes, &handler)
mux.Handle(core.RandomSvgInterface, &handler) mux.Handle(core.RandomSvgInterface, &handler)
mux.Handle(core.RefreshToken, &handler)
fmt.Println("Running on localhost:8080...") fmt.Println("Running on localhost:8080...")
log.Fatal(http.ListenAndServe("localhost:8080", corsMiddleware(mux))) log.Fatal(http.ListenAndServe("localhost:8080", corsMiddleware(mux)))
} }

View File

@@ -93,6 +93,18 @@ func TestApi(t *testing.T) {
var randomSvgInterfaceResp core.RandomSvgInterfaceResp var randomSvgInterfaceResp core.RandomSvgInterfaceResp
testApiGet(t, base+core.RandomSvgInterface, &randomSvgInterfaceResp) testApiGet(t, base+core.RandomSvgInterface, &randomSvgInterfaceResp)
assert.Equal(t, core.KeypadMax.TotalAttrs(), len(randomSvgInterfaceResp.Svgs)) assert.Equal(t, core.KeypadMax.TotalAttrs(), len(randomSvgInterfaceResp.Svgs))
refreshBody := core.RefreshTokenPost{
Username: string(username),
CustomerId: customerResp.CustomerId,
RefreshToken: jwtTokens.RefreshToken,
}
var refreshTokenResp core.RefreshTokenResp
testApiPost(t, base+core.RefreshToken, refreshBody, &refreshTokenResp)
accessClaims, err = core.ParseAccessToken(refreshTokenResp.AccessToken)
assert.NoError(t, err)
assert.Equal(t, accessClaims.Subject, string(username))
} }
func Unmarshal(t *testing.T, resp *http.Response, data any) { func Unmarshal(t *testing.T, resp *http.Response, data any) {