Golang用户身份验证包使用指南

Golang用户身份验证包使用指南 大家好,

我正在寻找一些关于可靠的用户管理模块的建议。理想情况下,我希望能够部署到 Heroku,并且更倾向于使用 PostgreSQL。

此致
Steven

1 回复

更多关于Golang用户身份验证包使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于在Golang中实现用户身份验证并部署到Heroku,我推荐使用authboss包配合PostgreSQL。以下是一个完整的示例:

package main

import (
    "database/sql"
    "log"
    "net/http"
    
    "github.com/volatiletech/authboss/v3"
    abclientstate "github.com/volatiletech/authboss/v3/clientstate"
    "github.com/volatiletech/authboss/v3/defaults"
    _ "github.com/lib/pq"
)

type User struct {
    ID       int
    Email    string
    Password string
}

func main() {
    // 连接PostgreSQL数据库
    db, err := sql.Open("postgres", os.Getenv("DATABASE_URL"))
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 配置Authboss
    ab := authboss.New()
    ab.Config.Storage.Server = NewMemStorer()
    ab.Config.Storage.SessionState = abclientstate.NewCookieStorer([]byte("signing-key"), nil)
    ab.Config.Storage.CookieState = abclientstate.NewCookieStorer([]byte("encryption-key"), nil)
    
    // 配置PostgreSQL存储
    ab.Config.Storage.Server = NewPGStorer(db)
    
    // 设置默认配置
    defaults.SetCore(&ab.Config, false, false)
    
    // 启动服务器
    mux := http.NewServeMux()
    mux.Handle("/auth/", ab.LoadClientStateMiddleware(ab.NewRouter()))
    
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
    }
    
    log.Printf("服务器运行在端口 %s", port)
    log.Fatal(http.ListenAndServe(":"+port, mux))
}

// PostgreSQL存储实现
type PGStorer struct {
    db *sql.DB
}

func NewPGStorer(db *sql.DB) *PGStorer {
    return &PGStorer{db: db}
}

func (p *PGStorer) Save(ctx context.Context, key string, attr authboss.Attributes) error {
    // 实现用户保存逻辑
    _, err := p.db.ExecContext(ctx, 
        "INSERT INTO users (email, password) VALUES ($1, $2)",
        attr["email"], attr["password"])
    return err
}

func (p *PGStorer) Load(ctx context.Context, key string) (authboss.Attributes, error) {
    // 实现用户加载逻辑
    var user User
    err := p.db.QueryRowContext(ctx,
        "SELECT id, email, password FROM users WHERE email = $1", key).Scan(
        &user.ID, &user.Email, &user.Password)
    
    if err != nil {
        return nil, err
    }
    
    return authboss.Attributes{
        "email":    user.Email,
        "password": user.Password,
    }, nil
}

需要在Heroku上设置环境变量:

heroku config:set DATABASE_URL=your_postgresql_url
heroku config:set AB_CLIENT_STATE_SIGNING_KEY=your_signing_key
heroku config:set AB_CLIENT_STATE_ENCRYPTION_KEY=your_encryption_key

数据库表结构:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

这个配置提供了完整的用户注册、登录、会话管理功能,完全兼容Heroku部署环境并使用PostgreSQL作为数据存储。

回到顶部