首先为您的项目创建一个新文件夹,并使用以下命令初始化 Go 模块:
去 mod init github.com/vishaaxl/cheershare
首先设置一个具有以下文件夹结构的新 Go 项目:
my-otp-auth-server/ ├── cmd/ │ └── api/ │ └── main.go │ └── user.go │ └── token.go ├── internal/ │ └── data/ │ ├── models.go │ └── user.go │ └── token.go ├── docker-compose.yml ├── go.mod └── Makefile
接下来,设置 docker-compose.yml 文件。此配置将定义您将在本教程中使用的服务(PostgreSQL 和 Redis)。
我们将从配置我们的项目所需的服务开始。对于后端,我们需要以下内容:
Redis:我们将使用 redis:6 映像。该服务将配置安全访问密码,公开端口 6379,并使用 --requirepass 标志强制进行密码身份验证以保护 Redis 访问。
PostgreSQL:我们将使用 postgres:13 映像。该服务将定义默认用户、密码和数据库,公开端口 5432 进行通信,并使用命名卷 (postgres_data) 保存数据以确保持久性。
可选:
// docker-compose.yml services: postgres: image: postgres:13 container_name: postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: mysecretpassword POSTGRES_DB: cheershare ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data redis: image: redis:6 container_name: redis environment: REDIS_PASSWORD: mysecretpassword ports: - "6379:6379" command: ["redis-server", "--requirepass", "mysecretpassword"] volumes: postgres_data:
为了路由和处理 HTTP 请求,我们将使用 github.com/julienschmidt/httprouter 包。要安装依赖项,请运行以下命令:
go get github.com/julienschmidt/httprouter
接下来,在 cmd/api/main.go 创建一个文件并粘贴以下代码。注释中提供了每行的解释:
// main.go package main import ( "fmt" "log" "net/http" "os" "time" "github.com/julienschmidt/httprouter" ) /* config struct: - Holds application-wide configuration settings such as: - `port`: The port number on which the server will listen. - `env`: The current environment (e.g., "development", "production"). */ type config struct { port int env string } /* applications struct: - Encapsulates the application's dependencies, including: - `config`: The application's configuration settings. - `logger`: A logger instance to handle log messages. */ type applications struct { config config logger *log.Logger } func main() { cfg := &config{ port: 4000, env: "development", } logger := log.New(os.Stdout, "INFO\t", log.Ldate|log.Ltime) app := &applications{ config: *cfg, logger: logger, } router := httprouter.New() router.GET("/", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { w.WriteHeader(http.StatusOK) fmt.Fprintln(w, "Welcome to the Go application!") }) /* Initialize the HTTP server - Set the server's address to listen on the specified port. - Assign the router as the handler. - Configure timeouts for idle, read, and write operations. - Set up an error logger to capture server errors. */ srv := &http.Server{ Addr: fmt.Sprintf(":%d", app.config.port), Handler: router, IdleTimeout: time.Minute, ReadTimeout: 10 * time.Second, WriteTimeout: 30 * time.Second, } app.logger.Printf("Starting server on port %d in %s mode", app.config.port, app.config.env) err := srv.ListenAndServe() if err != nil { app.logger.Fatalf("Could not start server: %s", err) } }
现在,您可以通过使用 go run ./cmd/api 启动服务器并向 http://localhost:4000 发送请求来测试您的设置,这将返回一条欢迎消息。接下来,我们将定义三个附加路由来实现我们的核心功能:
/send-otp:此路由将处理向用户发送 OTP。它将生成一个唯一的 OTP,将其存储在 Redis 中,并将其传递给用户。
/verify-otp:此路由将验证用户提供的 OTP。它将检查 Redis 中存储的值以确认用户的身份。
/login:一旦验证 OTP 并成功创建用户,此路由将处理用户登录功能。
但在继续之前,我们需要一种方法来存储用户信息,例如电话号码及其一次性密码,为此我们需要连接到我们之前在 docker-compose.yml 文件中定义的服务。
在实现路由之前,让我们定义两个基本的辅助函数。这些函数将处理与 Redis 和 PostgreSQL 服务器的连接,确保我们的后端可以与这些服务交互。
修改“config”结构以存储有关服务的信息。 这些功能非常不言自明。
my-otp-auth-server/ ├── cmd/ │ └── api/ │ └── main.go │ └── user.go │ └── token.go ├── internal/ │ └── data/ │ ├── models.go │ └── user.go │ └── token.go ├── docker-compose.yml ├── go.mod └── Makefile
通过 docker-compose up -d 命令启动服务后,您可以使用这些函数建立与 PostgreSQL 数据库和 Redis 服务器的连接。
在下一部分中,我们将开始研究之前讨论过的那些路线。这就是你的 main.go 文件现在应该的样子。
// docker-compose.yml services: postgres: image: postgres:13 container_name: postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: mysecretpassword POSTGRES_DB: cheershare ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data redis: image: redis:6 container_name: redis environment: REDIS_PASSWORD: mysecretpassword ports: - "6379:6379" command: ["redis-server", "--requirepass", "mysecretpassword"] volumes: postgres_data:
以上是使用 Go 构建基于 OTP 的身份验证服务器:第 1 部分的详细内容。更多信息请关注PHP中文网其他相关文章!