From 18e61160a580f185eb02699d74786c9ba9dd7add Mon Sep 17 00:00:00 2001 From: Rahul Chocha Date: Thu, 21 Sep 2023 17:36:09 +0530 Subject: [PATCH 1/2] feat: add support for access token generation and validation --- auth.go | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 auth.go diff --git a/auth.go b/auth.go new file mode 100644 index 0000000..cd62933 --- /dev/null +++ b/auth.go @@ -0,0 +1,98 @@ +package memphis + +import ( + "encoding/json" + "time" +) + +const ( + accessTokenValidationSubject = "$memphis_access_token_validation" + accessTokenGenerationSubject = "$memphis_access_token_generation" +) + +type AccessTokenResp struct { + AccessKeyID string `json:"access_key_id"` + SecretKey string `json:"secret_key"` +} + +type generateAccessTokenReq struct { + Description string `json:"description"` + Username string `json:"username"` +} + +type generateAccessTokenResp struct { + AccessKeyID string `json:"access_key_id"` + SecretKey string `json:"secret_key"` + Err string `json:"error"` +} + +type validateAccessTokenReq struct { + AccessKeyID string `json:"access_key_id"` + SecretKey string `json:"secret_key"` +} + +type validateAccessTokenResp struct { + IsValid bool `json:"is_valid"` + Err string `json:"error"` +} + +func (c *Conn) GenerateAccessToken(username, description string) (*AccessTokenResp, error) { + req := generateAccessTokenReq{ + Username: username, + Description: description, + } + + b, err := json.Marshal(req) + if err != nil { + return nil, memphisError(err) + } + + msg, err := c.brokerConn.Request(accessTokenGenerationSubject, b, 20*time.Second) + if err != nil { + return nil, memphisError(err) + } + + ar := &generateAccessTokenResp{} + err = json.Unmarshal(msg.Data, ar) + if err != nil { + return nil, defaultHandleCreationResp(msg.Data) + } + + if ar.Err != "" { + return nil, defaultHandleCreationResp([]byte(ar.Err)) + } + + return &AccessTokenResp{ + AccessKeyID: ar.AccessKeyID, + SecretKey: ar.SecretKey, + }, nil +} + +func (c *Conn) ValidateAccessToken(accessKeyID, secretKey string) (bool, error) { + req := validateAccessTokenReq{ + AccessKeyID: accessKeyID, + SecretKey: secretKey, + } + + b, err := json.Marshal(req) + if err != nil { + return false, memphisError(err) + } + + msg, err := c.brokerConn.Request(accessTokenValidationSubject, b, 20*time.Second) + if err != nil { + return false, memphisError(err) + } + + vr := &validateAccessTokenResp{} + err = json.Unmarshal(msg.Data, vr) + if err != nil { + return false, defaultHandleCreationResp(msg.Data) + } + + if vr.Err != "" { + return false, defaultHandleCreationResp([]byte(vr.Err)) + } + + return vr.IsValid, nil +} From 128ad8e23ae9a1aa5f2753dac136fa69438e29d1 Mon Sep 17 00:00:00 2001 From: Rahul Chocha Date: Thu, 21 Sep 2023 18:15:17 +0530 Subject: [PATCH 2/2] chore: minor format fix and variable name refactoring --- auth.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/auth.go b/auth.go index cd62933..a36bd3a 100644 --- a/auth.go +++ b/auth.go @@ -10,7 +10,7 @@ const ( accessTokenGenerationSubject = "$memphis_access_token_generation" ) -type AccessTokenResp struct { +type AccessToken struct { AccessKeyID string `json:"access_key_id"` SecretKey string `json:"secret_key"` } @@ -36,7 +36,7 @@ type validateAccessTokenResp struct { Err string `json:"error"` } -func (c *Conn) GenerateAccessToken(username, description string) (*AccessTokenResp, error) { +func (c *Conn) GenerateAccessToken(username, description string) (*AccessToken, error) { req := generateAccessTokenReq{ Username: username, Description: description, @@ -62,7 +62,7 @@ func (c *Conn) GenerateAccessToken(username, description string) (*AccessTokenRe return nil, defaultHandleCreationResp([]byte(ar.Err)) } - return &AccessTokenResp{ + return &AccessToken{ AccessKeyID: ar.AccessKeyID, SecretKey: ar.SecretKey, }, nil