Golang构建时如何包含非Go文件(如JSON)?

Golang构建时如何包含非Go文件(如JSON)? 我目前正在开发一个使用 OAuth2 与 Gmail API 交互的应用程序。在该应用中,我读取一个 credentials.json 文件来获取客户端 ID 和密钥。

由于这些是敏感数据,我希望将它们与包一起构建,这样构建出的可执行文件就不再需要查找 credentials.json 文件。同时,我也不想简单地将凭证明文包含在代码中。

是否有可能实现这一点?

9 回复

我曾使用过一个名为 statik 的项目来将文件嵌入到二进制文件中。不过,你嵌入的文件并不安全

更多关于Golang构建时如何包含非Go文件(如JSON)?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你正在尝试访问哪个API?是Google的吗?😊

肯定有另一种方法,因为无论如何都不应该将client_secret留给用户。

所以,client_idclient_secret可以通过二进制文件轻易找到吗?

是的,我进行了一些研究,也得出了同样的结论。不过,我认为问题本身确实指向了一个普遍情况。

我正在使用那个流程。令牌等所有内容都只在客户端生成。但为了发起授权请求,我需要传入我的客户端凭据(属于应用程序),这正是我目前卡住的地方,我在犹豫是否要将其开源。

// 代码部分保持原样

我正在使用谷歌官方的Gmail API

如果它存在,它就存在。如果有人愿意,他们可以逆向工程你的二进制文件并提取数据。考虑使用OAuth流程,让用户授权你的应用代表他进行操作,怎么样?

根据我的理解,在使用用户对你的应用进行身份验证的 OAuth 流程时,你只需要 client_id。而同时使用 client_secret 的模式适用于用户无法访问密钥的服务器端场景。

在Go中,你可以通过embed包(Go 1.16+)将非Go文件嵌入到二进制文件中。以下是具体实现:

package main

import (
    "embed"
    "encoding/json"
    "log"
)

//go:embed credentials.json
var credentialsFS embed.FS

type Credentials struct {
    ClientID     string `json:"client_id"`
    ClientSecret string `json:"client_secret"`
}

func main() {
    // 读取嵌入的JSON文件
    data, err := credentialsFS.ReadFile("credentials.json")
    if err != nil {
        log.Fatal("读取凭据文件失败:", err)
    }

    var creds Credentials
    if err := json.Unmarshal(data, &creds); err != nil {
        log.Fatal("解析JSON失败:", err)
    }

    // 使用凭据
    log.Printf("客户端ID: %s", creds.ClientID)
    log.Printf("客户端密钥: %s", creds.ClientSecret)
}

目录结构:

project/
├── main.go
└── credentials.json

credentials.json内容示例:

{
    "client_id": "your-client-id.apps.googleusercontent.com",
    "client_secret": "your-client-secret"
}

构建命令:

go build -o myapp

构建后,可执行文件将包含credentials.json的内容,运行时无需外部文件。

对于多个文件或目录,可以使用:

//go:embed configs/*.json
var configFS embed.FS

// 读取特定文件
data, _ := configFS.ReadFile("configs/credentials.json")

注意:嵌入的文件内容在编译时确定,运行时无法修改。敏感数据仍会出现在二进制文件中,建议结合加密措施。

回到顶部