首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在go-gin框架中验证API密钥?

如何在go-gin框架中验证API密钥?
EN

Stack Overflow用户
提问于 2021-02-18 12:38:39
回答 1查看 523关注 0票数 1

因此,我目前有一个函数,它将接受一个字符串APIKey来根据我的MongoDB集合检查它。如果未找到任何内容(未经过身份验证),则返回false;如果找到用户,则返回true。然而,我的问题是,我不确定如何将其与Gin POST路由集成。下面是我的代码:

代码语言:javascript
复制
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)运行此函数并传入users集合。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-20 07:29:38

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

代码语言:javascript
复制
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
    }
}

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

代码语言:javascript
复制
v1.POST("/upload", validateAPIKey(users), handleUpload)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66253718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档