首页 > 后端开发 > Golang > 使用 Go 构建基于 OTP 的身份验证服务器:第 1 部分

使用 Go 构建基于 OTP 的身份验证服务器:第 1 部分

Linda Hamilton
发布: 2025-01-05 09:54:39
原创
810 人浏览过

Build an OTP-Based Authentication Server with Go: Part 1

入门

首先为您的项目创建一个新文件夹,并使用以下命令初始化 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)。

使用 Docker Compose 设置服务

我们将从配置我们的项目所需的服务开始。对于后端,我们需要以下内容:

  • Redis:我们将使用 redis:6 映像。该服务将配置安全访问密码,公开端口 6379,并使用 --requirepass 标志强制进行密码身份验证以保护 Redis 访问。

  • PostgreSQL:我们将使用 postgres:13 映像。该服务将定义默认用户、密码和数据库,公开端口 5432 进行通信,并使用命名卷 (postgres_data) 保存数据以确保持久性。

可选:

  • 主要后端服务:您也可以在这里定义主要后端服务,它将与 PostgreSQL 和 Redis 交互。
// 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 发送请求来测试您的设置,这将返回一条欢迎消息。接下来,我们将定义三个附加路由来实现我们的核心功能:

  1. /send-otp:此路由将处理向用户发送 OTP。它将生成一个唯一的 OTP,将其存储在 Redis 中,并将其传递给用户。

  2. /verify-otp:此路由将验证用户提供的 OTP。它将检查 Redis 中存储的值以确认用户的身份。

  3. /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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板