database + auth
Some checks failed
build / build (push) Failing after 0s

This commit is contained in:
Tijl 2024-08-21 17:54:36 +02:00
parent 3732fb2fa4
commit 2bbf24f581
Signed by: tijl
GPG Key ID: DAE24BFCD722F053
9 changed files with 85 additions and 43 deletions

View File

@ -89,7 +89,14 @@ func main() {
return nil return nil
}) })
app.Get("/login", oidc.HandleRedirect) app.Get("/login", func(c *fiber.Ctx) error {
_, err := sessions.GetSession(c)
if err == nil {
return c.Redirect("/account")
} else {
return oidc.HandleRedirect(c)
}
})
app.Get(config.Config.Oidc.CallbackUrl, oidc.HandleCallback) app.Get(config.Config.Oidc.CallbackUrl, oidc.HandleCallback)
// Static routes // Static routes

View File

@ -37,5 +37,4 @@ func Load(ctx context.Context) {
Verifier = Provider.Verifier(oidcConfig) Verifier = Provider.Verifier(oidcConfig)
log.Debug().Msg("loaded oidc") log.Debug().Msg("loaded oidc")
log.Debug().Interface("Config", Config).Msg("data")
} }

View File

@ -2,6 +2,7 @@ package sessions
import ( import (
"context" "context"
"errors"
"git.tijl.dev/tijl/tijl.dev/internal/db" "git.tijl.dev/tijl/tijl.dev/internal/db"
"git.tijl.dev/tijl/tijl.dev/internal/utils" "git.tijl.dev/tijl/tijl.dev/internal/utils"
@ -24,7 +25,7 @@ func NewSession(uid string, c *fiber.Ctx) (string, error) {
Secure: true, Secure: true,
}) })
err = db.Queries.QuickUpdateSession(context.TODO(), database.QuickUpdateSessionParams{ _, err = db.Queries.QuickUpdateSession(context.TODO(), database.QuickUpdateSessionParams{
Token: createSessionParams.Token, Token: createSessionParams.Token,
IpAddress: c.IP(), IpAddress: c.IP(),
Agent: string(c.Context().UserAgent()), Agent: string(c.Context().UserAgent()),
@ -36,18 +37,21 @@ func NewSession(uid string, c *fiber.Ctx) (string, error) {
return createSessionParams.Token, nil return createSessionParams.Token, nil
} }
func GetSession(c *fiber.Ctx) (database.Session, error) { func GetSession(c *fiber.Ctx) (string, error) {
err := db.Queries.QuickUpdateSession(context.TODO(), database.QuickUpdateSessionParams{ if c.Cookies("session") == "" {
return "", errors.New("no cookie found")
}
uid, err := db.Queries.QuickUpdateSession(context.TODO(), database.QuickUpdateSessionParams{
Token: c.Cookies("session"), Token: c.Cookies("session"),
IpAddress: c.IP(), IpAddress: c.IP(),
Agent: string(c.Context().UserAgent()), Agent: string(c.Context().UserAgent()),
}) })
if err != nil { if err != nil {
return database.Session{}, err return uid, err
} }
session, err := db.Queries.GetSession(context.TODO(), c.Cookies("session")) //session, err := db.Queries.GetSession(context.TODO(), c.Cookies("session"))
if err != nil { //if err != nil {
return session, err // return session, err
} //}
return session, nil return uid, nil
} }

View File

@ -6,5 +6,6 @@
"english": "English", "english": "English",
"dutch": "Dutch", "dutch": "Dutch",
"about": "About", "about": "About",
"projects": "Projects" "projects": "Projects",
"account": "Account"
} }

View File

@ -6,5 +6,6 @@
"english": "Engels", "english": "Engels",
"dutch": "Nederlands", "dutch": "Nederlands",
"about": "Over", "about": "Over",
"projects": "Projecten" "projects": "Projecten",
"account": "Account"
} }

View File

@ -19,6 +19,10 @@ CREATE TABLE sessions (
FOREIGN KEY (uid) REFERENCES users (uid) FOREIGN KEY (uid) REFERENCES users (uid)
); );
-- Creating indexes for better performance
CREATE INDEX idx_sessions_last_activity ON sessions (last_activity);
CREATE INDEX idx_sessions_token ON sessions (token);
CREATE TABLE session_ips ( CREATE TABLE session_ips (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
session_id INTEGER NOT NULL, session_id INTEGER NOT NULL,
@ -29,3 +33,7 @@ CREATE TABLE session_ips (
CONSTRAINT session_ips_unique UNIQUE (session_id, ip_address) CONSTRAINT session_ips_unique UNIQUE (session_id, ip_address)
); );
-- Creating indexes for better performance
CREATE INDEX idx_session_ips_session_id_ip_address ON session_ips (session_id, ip_address);
CREATE INDEX idx_session_ips_access_time ON session_ips (access_time);

View File

@ -10,24 +10,29 @@ SELECT * FROM sessions WHERE uid = $1 AND (expires > CURRENT_TIMESTAMP OR expire
-- name: CreateSession :exec -- name: CreateSession :exec
INSERT INTO sessions (uid, token, last_activity) VALUES ($1, $2, CURRENT_TIMESTAMP); INSERT INTO sessions (uid, token, last_activity) VALUES ($1, $2, CURRENT_TIMESTAMP);
-- name: QuickUpdateSession :exec -- name: QuickUpdateSession :one
WITH updated_session AS ( WITH updated_session AS (
UPDATE sessions UPDATE sessions
SET last_activity = CURRENT_TIMESTAMP SET last_activity = CURRENT_TIMESTAMP
WHERE token = $1 WHERE token = $1
RETURNING id RETURNING id, uid
) ),
INSERT INTO session_ips (session_id, ip_address, agent, access_time) inserted_or_updated AS (
VALUES ( INSERT INTO session_ips (session_id, ip_address, agent, access_time)
VALUES (
(SELECT id FROM updated_session), (SELECT id FROM updated_session),
$2, $2,
$3, $3,
CURRENT_TIMESTAMP CURRENT_TIMESTAMP
) )
ON CONFLICT (session_id, ip_address) ON CONFLICT (session_id, ip_address)
DO UPDATE SET DO UPDATE SET
agent = EXCLUDED.agent, agent = EXCLUDED.agent,
access_time = CURRENT_TIMESTAMP; access_time = CURRENT_TIMESTAMP
RETURNING session_id
)
SELECT uid
FROM updated_session;
-- name: ExpireSession :exec -- name: ExpireSession :exec
UPDATE sessions SET expires = 1 WHERE token = $1; UPDATE sessions SET expires = 1 WHERE token = $1;

View File

@ -128,24 +128,29 @@ func (q *Queries) GetSessions(ctx context.Context, arg GetSessionsParams) ([]Ses
return items, nil return items, nil
} }
const quickUpdateSession = `-- name: QuickUpdateSession :exec const quickUpdateSession = `-- name: QuickUpdateSession :one
WITH updated_session AS ( WITH updated_session AS (
UPDATE sessions UPDATE sessions
SET last_activity = CURRENT_TIMESTAMP SET last_activity = CURRENT_TIMESTAMP
WHERE token = $1 WHERE token = $1
RETURNING id RETURNING id, uid
) ),
INSERT INTO session_ips (session_id, ip_address, agent, access_time) inserted_or_updated AS (
VALUES ( INSERT INTO session_ips (session_id, ip_address, agent, access_time)
VALUES (
(SELECT id FROM updated_session), (SELECT id FROM updated_session),
$2, $2,
$3, $3,
CURRENT_TIMESTAMP CURRENT_TIMESTAMP
) )
ON CONFLICT (session_id, ip_address) ON CONFLICT (session_id, ip_address)
DO UPDATE SET DO UPDATE SET
agent = EXCLUDED.agent, agent = EXCLUDED.agent,
access_time = CURRENT_TIMESTAMP access_time = CURRENT_TIMESTAMP
RETURNING session_id
)
SELECT uid
FROM updated_session
` `
type QuickUpdateSessionParams struct { type QuickUpdateSessionParams struct {
@ -154,7 +159,9 @@ type QuickUpdateSessionParams struct {
Agent string Agent string
} }
func (q *Queries) QuickUpdateSession(ctx context.Context, arg QuickUpdateSessionParams) error { func (q *Queries) QuickUpdateSession(ctx context.Context, arg QuickUpdateSessionParams) (string, error) {
_, err := q.db.ExecContext(ctx, quickUpdateSession, arg.Token, arg.IpAddress, arg.Agent) row := q.db.QueryRowContext(ctx, quickUpdateSession, arg.Token, arg.IpAddress, arg.Agent)
return err var uid string
err := row.Scan(&uid)
return uid, err
} }

View File

@ -81,12 +81,22 @@
</ul> </ul>
</details> </details>
</li> </li>
<li><a class="active flex gap-4" hx-boost="false" href="/login"> <li>
{{if .SignedIn}}
<a class="flex gap-4" href="/account">
<span class="w-5 text-center">
{{icon "login"}}
</span>
<span class="text-base">{{.T.account}}</span>
</a>
{{else}}
<a class="active flex gap-4" hx-boost="false" href="/login">
<span class="w-5 text-center"> <span class="w-5 text-center">
{{icon "login"}} {{icon "login"}}
</span> </span>
<span class="text-base">{{.T.login}}</span> <span class="text-base">{{.T.login}}</span>
</a> </a>
{{end}}
</li> </li>
</ul> </ul>
</details> </details>