使用 Go 语言构建 API 接口与用户认证 | 青训营

97 阅读2分钟

在本文中,我们将探讨如何使用 Go 语言构建一个基本的 API 接口,并实现用户认证功能。我们将使用 Go 的标准库以及一些常用的第三方库来完成这个任务。

初始化项目

首先,需要初始化一个新的 Go 项目。在工作目录中,创建一个新文件夹,然后打开终端并进入该文件夹。

mkdir my-api-project
cd my-api-project

接下来,初始化 Go 模块:

go mod init myapi

创建 API 接口

将使用标准库的 net/http 包来创建 API 接口。在项目文件夹中创建一个名为 main.go 的文件,并添加以下内容:

package main
​
import (
    "net/http"
    "encoding/json"
)
​
type Item struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}
​
var items []Item
​
func main() {
    http.HandleFunc("/items", getItems)
    http.ListenAndServe(":8080", nil)
}
​
func getItems(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(items)
}

这段代码中创建了一个简单的 /items 接口,用于返回一个包含项目信息的 JSON 列表。可以使用 net/http 包来创建 HTTP 服务器和路由。

实现用户认证

实现一个简单的用户认证功能,使用基本的用户名和密码来进行认证。将使用 gorilla/mux 来处理路由,并使用 auth 包来处理用户认证。首先,安装依赖:

go get github.com/gorilla/mux
go get golang.org/x/crypto/bcrypt

接下来,将添加用户认证相关的代码到 main.go 中:

package main
​
import (
    "net/http"
    "encoding/json"
    "github.com/gorilla/mux"
    "golang.org/x/crypto/bcrypt"
)
​
type User struct {
    Username string `json:"username"`
    Password string `json:"password"`
}
​
var users []User
​
func main() {
    r := mux.NewRouter()
​
    r.HandleFunc("/login", login).Methods("POST")
    r.HandleFunc("/items", getItems).Methods("GET")
​
    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}
​
func login(w http.ResponseWriter, r *http.Request) {
    var inputUser User
    err := json.NewDecoder(r.Body).Decode(&inputUser)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
​
    for _, user := range users {
        if user.Username == inputUser.Username {
            err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(inputUser.Password))
            if err == nil {
                w.WriteHeader(http.StatusOK)
                return
            }
        }
    }
​
    http.Error(w, "Unauthorized", http.StatusUnauthorized)
}
​
func getItems(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(items)
}

在这里,创建了一个 /login 接口,用于处理用户认证。使用 bcrypt 来安全地存储和比较密码。在 login 函数中,检查用户提供的用户名和密码是否匹配现有的用户列表中的任何条目。

总结

学习了如何使用 Go 语言构建基本的 API 接口并实现用户认证功能。使用了标准库的 net/http 包来创建 HTTP 服务器和路由,以及第三方库 gorilla/mux 来处理路由。还使用了 bcrypt 来进行密码的哈希存储和验证,以增加安全性。