implement jwt claims
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
10
core/type.go
10
core/type.go
@@ -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"`
|
||||||
}
|
}
|
||||||
|
|||||||
1
main.go
1
main.go
@@ -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)))
|
||||||
}
|
}
|
||||||
|
|||||||
12
main_test.go
12
main_test.go
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user