Saving token to DB

This commit is contained in:
vinchent 2024-08-13 22:00:07 +02:00
parent 6b7ce5b719
commit e7f6983a22
4 changed files with 57 additions and 3 deletions

View File

@ -2,10 +2,12 @@ package main
import ( import (
"encoding/json" "encoding/json"
"fmt"
"myapp/internal/cards" "myapp/internal/cards"
"myapp/internal/models" "myapp/internal/models"
"net/http" "net/http"
"strconv" "strconv"
"time"
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
"github.com/stripe/stripe-go/v79" "github.com/stripe/stripe-go/v79"
@ -266,16 +268,32 @@ func (app *application) CreateAuthToken(w http.ResponseWriter, r *http.Request)
} }
// generate the token // generate the token
token, err := models.GenerateToken(user.ID, 24*time.Hour, models.ScopeAuthentication)
if err != nil {
app.errorLog.Println(err)
app.badRequest(w, r, err)
return
}
// save to DB
err = app.DB.InsertToken(token, user)
if err != nil {
app.errorLog.Println(err)
app.badRequest(w, r, err)
return
}
// send response // send response
var payload struct { var payload struct {
Error bool `json:"error"` Error bool `json:"error"`
Message string `json:"message"` Message string `json:"message"`
Token *models.Token `json:"authentication_token"`
} }
payload.Error = false payload.Error = false
payload.Message = "Success!" payload.Message = fmt.Sprintf("token for %s created", userInput.Email)
payload.Token = token
_ = app.writeJSON(w, http.StatusOK, payload) _ = app.writeJSON(w, http.StatusOK, payload)
} }

View File

@ -1,6 +1,7 @@
package models package models
import ( import (
"context"
"crypto/rand" "crypto/rand"
"crypto/sha256" "crypto/sha256"
"encoding/base32" "encoding/base32"
@ -40,3 +41,25 @@ func GenerateToken(userID int, ttl time.Duration, scope string) (*Token, error)
token.Hash = hash[:] token.Hash = hash[:]
return token, nil return token, nil
} }
func (m *DBModel) InsertToken(t *Token, u User) error {
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
stmt := `INSERT INTO tokens
(user_id, name, email, token_hash, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?)`
_, err := m.DB.ExecContext(ctx, stmt,
u.ID,
u.LastName,
u.Email,
t.Hash,
time.Now(),
time.Now(),
)
if err != nil {
return err
}
return nil
}

View File

@ -0,0 +1,2 @@
drop_table("tokens")

View File

@ -0,0 +1,11 @@
create_table("tokens") {
t.Column("id", "integer", {primary: true})
t.Column("user_id", "integer", {"unsigned": true})
t.Column("name", "string", {"size": 255})
t.Column("email", "string", {})
t.Column("token_hash", "string", {})
}
sql("ALTER TABLE tokens MODIFY token_hash varbinary(255);")
sql("ALTER TABLE tokens ALTER COLUMN created_at SET DEFAULT now();")
sql("ALTER TABLE tokens ALTER COLUMN updated_at SET DEFAULT now();")