Skip to content

Commit a50f6be

Browse files
committed
[server]fix: error redirection for email verification
1 parent a6f6e0b commit a50f6be

File tree

8 files changed

+57
-22
lines changed

8 files changed

+57
-22
lines changed

server/handlers/verify_email.go

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,22 @@ import (
2424
// It verifies email based on JWT token in query string
2525
func VerifyEmailHandler() gin.HandlerFunc {
2626
return func(c *gin.Context) {
27+
redirectURL := strings.TrimSpace(c.Query("redirect_uri"))
2728
errorRes := gin.H{
28-
"error": "invalid_token",
29+
"error": "token is required",
2930
}
3031
tokenInQuery := c.Query("token")
3132
if tokenInQuery == "" {
3233
log.Debug("Token is empty")
33-
c.JSON(400, errorRes)
34+
utils.HandleRedirectORJsonResponse(c, http.StatusBadRequest, errorRes, generateRedirectURL(redirectURL, errorRes))
3435
return
3536
}
3637

3738
verificationRequest, err := db.Provider.GetVerificationRequestByToken(c, tokenInQuery)
3839
if err != nil {
3940
log.Debug("Error getting verification request: ", err)
40-
errorRes["error_description"] = err.Error()
41-
c.JSON(400, errorRes)
41+
errorRes["error"] = err.Error()
42+
utils.HandleRedirectORJsonResponse(c, http.StatusBadRequest, errorRes, generateRedirectURL(redirectURL, errorRes))
4243
return
4344
}
4445

@@ -47,23 +48,23 @@ func VerifyEmailHandler() gin.HandlerFunc {
4748
claim, err := token.ParseJWTToken(tokenInQuery)
4849
if err != nil {
4950
log.Debug("Error parsing token: ", err)
50-
errorRes["error_description"] = err.Error()
51-
c.JSON(400, errorRes)
51+
errorRes["error"] = err.Error()
52+
utils.HandleRedirectORJsonResponse(c, http.StatusBadRequest, errorRes, generateRedirectURL(redirectURL, errorRes))
5253
return
5354
}
5455

5556
if ok, err := token.ValidateJWTClaims(claim, hostname, verificationRequest.Nonce, verificationRequest.Email); !ok || err != nil {
5657
log.Debug("Error validating jwt claims: ", err)
57-
errorRes["error_description"] = err.Error()
58-
c.JSON(400, errorRes)
58+
errorRes["error"] = err.Error()
59+
utils.HandleRedirectORJsonResponse(c, http.StatusBadRequest, errorRes, generateRedirectURL(redirectURL, errorRes))
5960
return
6061
}
6162

6263
user, err := db.Provider.GetUserByEmail(c, verificationRequest.Email)
6364
if err != nil {
6465
log.Debug("Error getting user: ", err)
65-
errorRes["error_description"] = err.Error()
66-
c.JSON(400, errorRes)
66+
errorRes["error"] = err.Error()
67+
utils.HandleRedirectORJsonResponse(c, http.StatusBadRequest, errorRes, generateRedirectURL(redirectURL, errorRes))
6768
return
6869
}
6970

@@ -79,7 +80,6 @@ func VerifyEmailHandler() gin.HandlerFunc {
7980
db.Provider.DeleteVerificationRequest(c, verificationRequest)
8081

8182
state := strings.TrimSpace(c.Query("state"))
82-
redirectURL := strings.TrimSpace(c.Query("redirect_uri"))
8383
rolesString := strings.TrimSpace(c.Query("roles"))
8484
var roles []string
8585
if rolesString == "" {
@@ -125,8 +125,8 @@ func VerifyEmailHandler() gin.HandlerFunc {
125125
authToken, err := token.CreateAuthToken(c, user, roles, scope, loginMethod, nonce, code)
126126
if err != nil {
127127
log.Debug("Error creating auth token: ", err)
128-
errorRes["error_description"] = err.Error()
129-
c.JSON(500, errorRes)
128+
errorRes["error"] = err.Error()
129+
utils.HandleRedirectORJsonResponse(c, http.StatusInternalServerError, errorRes, generateRedirectURL(redirectURL, errorRes))
130130
return
131131
}
132132

@@ -135,7 +135,7 @@ func VerifyEmailHandler() gin.HandlerFunc {
135135
// if code != "" {
136136
// if err := memorystore.Provider.SetState(code, codeChallenge+"@@"+authToken.FingerPrintHash); err != nil {
137137
// log.Debug("Error setting code state ", err)
138-
// errorRes["error_description"] = err.Error()
138+
// errorRes["error"] = err.Error()
139139
// c.JSON(500, errorRes)
140140
// return
141141
// }
@@ -189,3 +189,21 @@ func VerifyEmailHandler() gin.HandlerFunc {
189189
c.Redirect(http.StatusTemporaryRedirect, redirectURL)
190190
}
191191
}
192+
193+
func generateRedirectURL(url string, res map[string]interface{}) string {
194+
redirectURL := url
195+
if redirectURL == "" {
196+
return ""
197+
}
198+
var paramsArr []string
199+
for key, value := range res {
200+
paramsArr = append(paramsArr, key+"="+value.(string))
201+
}
202+
params := strings.Join(paramsArr, "&")
203+
if strings.Contains(redirectURL, "?") {
204+
redirectURL = redirectURL + "&" + params
205+
} else {
206+
redirectURL = redirectURL + "?" + strings.TrimPrefix(params, "&")
207+
}
208+
return redirectURL
209+
}

server/resolvers/magic_link_login.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ func MagicLinkLoginResolver(ctx context.Context, params model.MagicLinkLoginInpu
224224
go email.SendEmail([]string{params.Email}, constants.VerificationTypeMagicLinkLogin, map[string]interface{}{
225225
"user": user.ToMap(),
226226
"organization": utils.GetOrganization(),
227-
"verification_url": utils.GetEmailVerificationURL(verificationToken, hostname),
227+
"verification_url": utils.GetEmailVerificationURL(verificationToken, hostname, redirectURL),
228228
})
229229
}
230230

server/resolvers/resend_verify_email.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func ResendVerifyEmailResolver(ctx context.Context, params model.ResendVerifyEma
8383
go email.SendEmail([]string{params.Email}, params.Identifier, map[string]interface{}{
8484
"user": user.ToMap(),
8585
"organization": utils.GetOrganization(),
86-
"verification_url": utils.GetEmailVerificationURL(verificationToken, hostname),
86+
"verification_url": utils.GetEmailVerificationURL(verificationToken, hostname, verificationRequest.RedirectURI),
8787
})
8888

8989
res = &model.Response{

server/resolvers/signup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ func SignupResolver(ctx context.Context, params model.SignUpInput) (*model.AuthR
227227
email.SendEmail([]string{params.Email}, constants.VerificationTypeBasicAuthSignup, map[string]interface{}{
228228
"user": user.ToMap(),
229229
"organization": utils.GetOrganization(),
230-
"verification_url": utils.GetEmailVerificationURL(verificationToken, hostname),
230+
"verification_url": utils.GetEmailVerificationURL(verificationToken, hostname, redirectURL),
231231
})
232232
utils.RegisterEvent(ctx, constants.UserCreatedWebhookEvent, constants.AuthRecipeMethodBasicAuth, user)
233233
}()

server/resolvers/update_profile.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func UpdateProfileResolver(ctx context.Context, params model.UpdateProfileInput)
259259
go email.SendEmail([]string{user.Email}, verificationType, map[string]interface{}{
260260
"user": user.ToMap(),
261261
"organization": utils.GetOrganization(),
262-
"verification_url": utils.GetEmailVerificationURL(verificationToken, hostname),
262+
"verification_url": utils.GetEmailVerificationURL(verificationToken, hostname, redirectURL),
263263
})
264264

265265
}

server/resolvers/update_user.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func UpdateUserResolver(ctx context.Context, params model.UpdateUserInput) (*mod
164164
go email.SendEmail([]string{user.Email}, constants.VerificationTypeBasicAuthSignup, map[string]interface{}{
165165
"user": user.ToMap(),
166166
"organization": utils.GetOrganization(),
167-
"verification_url": utils.GetEmailVerificationURL(verificationToken, hostname),
167+
"verification_url": utils.GetEmailVerificationURL(verificationToken, hostname, redirectURL),
168168
})
169169

170170
}

server/utils/common.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func GetOrganization() map[string]interface{} {
8282

8383
// GetForgotPasswordURL to get url for given token and hostname
8484
func GetForgotPasswordURL(token, redirectURI string) string {
85-
verificationURL := redirectURI + "?token=" + token
85+
verificationURL := redirectURI + "?token=" + token + "&redirect_uri=" + redirectURI
8686
return verificationURL
8787
}
8888

@@ -92,6 +92,6 @@ func GetInviteVerificationURL(verificationURL, token, redirectURI string) string
9292
}
9393

9494
// GetEmailVerificationURL to get url for invite email verification
95-
func GetEmailVerificationURL(token, hostname string) string {
96-
return hostname + "/verify_email?token=" + token
95+
func GetEmailVerificationURL(token, hostname, redirectURI string) string {
96+
return hostname + "/verify_email?token=" + token + "&redirect_uri=" + redirectURI
9797
}

server/utils/response.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package utils
2+
3+
import (
4+
"net/http"
5+
"strings"
6+
7+
"github.com/gin-gonic/gin"
8+
)
9+
10+
// HandleRedirectORJsonResponse handles the response based on redirectURL
11+
func HandleRedirectORJsonResponse(c *gin.Context, httpResponse int, response map[string]interface{}, redirectURL string) {
12+
if strings.TrimSpace(redirectURL) == "" {
13+
c.JSON(httpResponse, response)
14+
} else {
15+
c.Redirect(http.StatusTemporaryRedirect, redirectURL)
16+
}
17+
}

0 commit comments

Comments
 (0)