58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
package account
|
|
|
|
import (
|
|
"git.supernets.org/perp/gopay/internal/context"
|
|
"git.supernets.org/perp/gopay/internal/jwt"
|
|
v1 "git.supernets.org/perp/gopay/internal/models/v1"
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
// @summary Login to an account
|
|
// @tags account
|
|
// @accept json
|
|
// @produce json
|
|
// @param register body v1.Register true "alice" "supersecretpassword"
|
|
// @success 200 {object} v1.Token
|
|
// @response default {object} v1.Error "There was an error"
|
|
// @router /v1/account/login [post]
|
|
func Login(ctx *context.Context) {
|
|
// Store body
|
|
var body *v1.Register
|
|
|
|
// Bind JSON
|
|
err := ctx.BindJSON(&body)
|
|
if err != nil {
|
|
ctx.Error(400, "MissingBody")
|
|
return
|
|
}
|
|
|
|
// Select account by username
|
|
account, err := ctx.Database.Account.SelectByUsername(body.Username)
|
|
if err != nil {
|
|
ctx.Error(500, "DatabaseError")
|
|
return
|
|
}
|
|
|
|
// Compare username
|
|
if account.Username != body.Username {
|
|
ctx.Error(400, "InvalidUsername")
|
|
return
|
|
}
|
|
|
|
// Compare password
|
|
err = bcrypt.CompareHashAndPassword([]byte(account.Password), []byte(body.Password))
|
|
if err != nil {
|
|
ctx.Error(400, "InvalidPassword")
|
|
return
|
|
}
|
|
|
|
// Generate token
|
|
token, err := jwt.Encode(account.ID)
|
|
if err != nil {
|
|
ctx.Error(500, "InternalServerError")
|
|
return
|
|
}
|
|
|
|
ctx.Token(token)
|
|
}
|