added resend verification token
This commit is contained in:
parent
6d41e4f041
commit
48268b31fa
9 changed files with 89 additions and 22 deletions
|
@ -25,6 +25,6 @@ SUPERKIT_SECRET = {{app_secret}}
|
|||
# Authentication Plugin
|
||||
SUPERKIT_AUTH_REDIRECT_AFTER_LOGIN = /profile
|
||||
SUPERKIT_AUTH_SESSION_EXPIRY_IN_HOURS = 48
|
||||
# Skip user email verification
|
||||
# Skip user email verification after signup
|
||||
SUPERKIT_AUTH_SKIP_VERIFY = false
|
||||
SUPERKIT_AUTH_EMAIL_VERIFICATION_EXPIRY_IN_HOURS = 1
|
||||
|
|
|
@ -2,6 +2,7 @@ package app
|
|||
|
||||
import (
|
||||
"AABBCCDD/app/events"
|
||||
"AABBCCDD/plugins/auth"
|
||||
|
||||
"github.com/anthdm/superkit/event"
|
||||
)
|
||||
|
@ -15,5 +16,6 @@ import (
|
|||
|
||||
// Register your events here.
|
||||
func RegisterEvents() {
|
||||
event.Subscribe("auth.signup", events.HandleUserSignup)
|
||||
event.Subscribe(auth.UserSignupEvent, events.OnUserSignup)
|
||||
event.Subscribe(auth.ResendVerificationEvent, events.OnResendVerificationToken)
|
||||
}
|
||||
|
|
27
bootstrap/app/events/auth.go
Normal file
27
bootstrap/app/events/auth.go
Normal file
|
@ -0,0 +1,27 @@
|
|||
package events
|
||||
|
||||
import (
|
||||
"AABBCCDD/plugins/auth"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Event handlers
|
||||
func OnUserSignup(ctx context.Context, event any) {
|
||||
userWithToken, ok := event.(auth.UserWithVerificationToken)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
b, _ := json.MarshalIndent(userWithToken, " ", " ")
|
||||
fmt.Println(string(b))
|
||||
}
|
||||
|
||||
func OnResendVerificationToken(ctx context.Context, event any) {
|
||||
userWithToken, ok := event.(auth.UserWithVerificationToken)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
b, _ := json.MarshalIndent(userWithToken, " ", " ")
|
||||
fmt.Println(string(b))
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
package events
|
||||
|
||||
import (
|
||||
"AABBCCDD/plugins/auth"
|
||||
"context"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Event handlers
|
||||
func HandleUserSignup(ctx context.Context, event any) {
|
||||
userWithToken, ok := event.(auth.UserWithVerificationToken)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
fmt.Printf("user signup: %v\n", userWithToken)
|
||||
}
|
|
@ -12,6 +12,7 @@ func InitializeRoutes(router chi.Router) {
|
|||
}
|
||||
|
||||
router.Get("/email/verify", kit.Handler(HandleEmailVerify))
|
||||
router.Post("/resend-email-verification", kit.Handler(HandleResendVerificationCode))
|
||||
|
||||
router.Group(func(auth chi.Router) {
|
||||
auth.Use(kit.WithAuthentication(authConfig, false))
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
package auth
|
||||
|
||||
import (
|
||||
"AABBCCDD/app/db"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
|
@ -46,11 +48,46 @@ func HandleSignupCreate(kit *kit.Kit) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
event.Emit("auth.signup", UserWithVerificationToken{
|
||||
event.Emit(UserSignupEvent, UserWithVerificationToken{
|
||||
Token: token,
|
||||
User: user,
|
||||
})
|
||||
return kit.Render(ConfirmEmail(user.Email))
|
||||
return kit.Render(ConfirmEmail(user))
|
||||
}
|
||||
|
||||
func HandleResendVerificationCode(kit *kit.Kit) error {
|
||||
idstr := kit.FormValue("userID")
|
||||
id, err := strconv.Atoi(idstr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var user User
|
||||
err = db.Query.NewSelect().
|
||||
Model(&user).
|
||||
Where("id = ?", id).
|
||||
Scan(kit.Request.Context())
|
||||
if err != nil {
|
||||
return kit.Text(http.StatusOK, "An unexpected error occured")
|
||||
}
|
||||
|
||||
if user.EmailVerifiedAt.After(time.Time{}) {
|
||||
return kit.Text(http.StatusOK, "Email already verified!")
|
||||
}
|
||||
|
||||
token, err := createVerificationToken(id)
|
||||
if err != nil {
|
||||
return kit.Text(http.StatusOK, "An unexpected error occured")
|
||||
}
|
||||
|
||||
event.Emit(ResendVerificationEvent, UserWithVerificationToken{
|
||||
User: user,
|
||||
Token: token,
|
||||
})
|
||||
|
||||
msg := fmt.Sprintf("A new verification token has been sent to %s", user.Email)
|
||||
|
||||
return kit.Text(http.StatusOK, msg)
|
||||
}
|
||||
|
||||
func createVerificationToken(userID int) (string, error) {
|
||||
|
|
|
@ -4,6 +4,8 @@ import (
|
|||
v "github.com/anthdm/superkit/validate"
|
||||
"AABBCCDD/app/views/layouts"
|
||||
"AABBCCDD/app/views/components"
|
||||
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type SignupIndexPageData struct {
|
||||
|
@ -91,6 +93,10 @@ templ SignupForm(values SignupFormValues, errors v.Errors) {
|
|||
</form>
|
||||
}
|
||||
|
||||
templ ConfirmEmail(email string) {
|
||||
<div class="text-sm">An email confirmation link has been sent to: <span class="underline font-medium">{ email }</span></div>
|
||||
templ ConfirmEmail(user User) {
|
||||
<form hx-post="/resend-email-verification" class="flex flex-col gap-4 text-sm">
|
||||
<input type="hidden" name="userID" value={ fmt.Sprint(user.ID) }/>
|
||||
<div>An email confirmation link has been sent to: <span class="underline font-medium">{ user.Email }</span></div>
|
||||
<div>Trouble receiving the verification code? <button class="underline font-medium cursor-pointer">Resend verification code</button></div>
|
||||
</form>
|
||||
}
|
||||
|
|
|
@ -8,6 +8,12 @@ import (
|
|||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
// Event name constants
|
||||
const (
|
||||
UserSignupEvent = "auth.signup"
|
||||
ResendVerificationEvent = "auth.resend.verification"
|
||||
)
|
||||
|
||||
// UserWithVerificationToken is a struct that will be sent over the
|
||||
// auth.signup event. It holds the User struct and the Verification token string.
|
||||
type UserWithVerificationToken struct {
|
||||
|
|
|
@ -68,6 +68,10 @@ func (kit *Kit) Redirect(status int, url string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (kit *Kit) FormValue(name string) string {
|
||||
return kit.Request.PostFormValue(name)
|
||||
}
|
||||
|
||||
func (kit *Kit) JSON(status int, v any) error {
|
||||
kit.Response.WriteHeader(status)
|
||||
kit.Response.Header().Set("Content-Type", "application/json")
|
||||
|
|
Loading…
Reference in a new issue