登录
首页 >  Golang >  Go问答

在 Go-Gin 框架中如何进行 API 密钥验证?

来源:stackoverflow

时间:2024-03-04 14:54:19 341浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《在 Go-Gin 框架中如何进行 API 密钥验证?》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

问题内容

所以我目前有一个函数,它将接受字符串 apikey 来对照我的 mongodb 集合进行检查。如果未找到任何内容(未经过身份验证),则返回 false - 如果找到用户,则返回 true。然而,我的问题是我不确定如何将其与 gin post 路由集成。这是我的代码:

import (
    "context"
    "fmt"
    "log"
    "os"

    "github.com/gin-gonic/gin"
    _ "github.com/joho/godotenv/autoload"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

type User struct {
    Name   string
    APIKey string
}

func validateAPIKey(users *mongo.Collection, APIKey string) bool {
    var user User

    filter := bson.D{primitive.E{Key: "APIKey", Value: APIKey}}
    if err := users.FindOne(context.TODO(), filter).Decode(&user); err != nil {
        fmt.Printf("Found 0 results for API Key: %s\n", APIKey)
        return false
    }

    fmt.Printf("Found: %s\n", user.Name)
    return true
}

func handleUpload(c *gin.Context) {

}

func main() {
    r := gin.Default()

    api := r.Group("/api")
    v1 := api.Group("/v1")

    v1.POST("/upload", handleUpload)

    mongoURI := os.Getenv("MONGO_URI")
    mongoOptions := options.Client().ApplyURI(mongoURI)
    client, err := mongo.Connect(context.TODO(), mongoOptions)
    if err != nil {
        log.Fatal(err, "Unable to access MongoDB server, exiting...")
    }
    defer client.Disconnect(context.TODO())

    // users := client.Database("sharex_api").Collection("authorized_users") // commented out when testing to ignore unused warnings

    r.Run(":8085")
}

如果单独测试,validateapikey 函数将完全按预期工作,我只是不确定如何为特定端点(在本例中为 /api/v1/upload)运行此函数并传入用户集合。


解决方案


经过一番搜索,我找到了解决方案。我更改了 validateapikey 函数以返回 git.handlerfunc。代码如下:

func validateapikey(users *mongo.collection) gin.handlerfunc {
    return func(c *gin.context) {
        var user authorizeduser
        apikey := c.request.header.get("x-api-key")

        filter := bson.d{primitive.e{key: "apikey", value: apikey}}
        if err := users.findone(context.todo(), filter).decode(&user); err != nil {
            fmt.printf("found 0 results for api key: %s\n", apikey)
            c.json(http.statusunauthorized, gin.h{"status": 401, "message": "authentication failed"})
            return
        }

        return
    }
}

对于路线,我有以下内容:

v1.POST("/upload", validateAPIKey(users), handleUpload)

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>