package vm
import (
"github.com/bonfy/go-mega-code/config"
"github.com/bonfy/go-mega-code/model"
)
// EmailViewModel struct
type EmailViewModel struct {
Username string
Token string
Server string
}
// EmailViewModelOp struct
type EmailViewModelOp struct{}
// GetVM func
func (EmailViewModelOp) GetVM(email string) EmailViewModel {
v := EmailViewModel{}
u, _ := model.GetUserByEmail(email)
v.Username = u.Username
v.Token, _ = u.GenerateToken()
v.Server = config.GetServerURL()
return v
}
<p>Dear {{.Username}},</p>
<p>
To reset your password
<a href="{{.Server}}/reset_password/{{.Token}}">
click here
</a>.
</p>
<p>Alternatively, you can paste the following link in your browser's address bar:</p>
<p>{{.Server}}/reset_password/{{.Token}}</p>
<p>If you have not requested a password reset simply ignore this message.</p>
<p>This Email will expire in 2 hours.</p>
<p>Sincerely,</p>
<p>BONFY</p>
...
// GenerateToken func
func (u *User) GenerateToken() (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"username": u.Username,
"exp": time.Now().Add(time.Hour * 2).Unix(), // 可以添加过期时间
})
return token.SignedString([]byte("secret"))
}
// CheckToken func
func CheckToken(tokenString string) (string, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
// Don't forget to validate the alg is what you expect:
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
}
// hmacSampleSecret is a []byte containing your secret, e.g. []byte("my_secret_key")
return []byte("secret"), nil
})
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
return claims["username"].(string), nil
} else {
return "", err
}
}
...