Golang构建时如何包含非Go文件(如JSON)?
Golang构建时如何包含非Go文件(如JSON)?
我目前正在开发一个使用 OAuth2 与 Gmail API 交互的应用程序。在该应用中,我读取一个 credentials.json 文件来获取客户端 ID 和密钥。
由于这些是敏感数据,我希望将它们与包一起构建,这样构建出的可执行文件就不再需要查找 credentials.json 文件。同时,我也不想简单地将凭证明文包含在代码中。
是否有可能实现这一点?
我曾使用过一个名为 statik 的项目来将文件嵌入到二进制文件中。不过,你嵌入的文件并不安全!
更多关于Golang构建时如何包含非Go文件(如JSON)?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你正在尝试访问哪个API?是Google的吗?😊
肯定有另一种方法,因为无论如何都不应该将client_secret留给用户。
所以,client_id和client_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")
注意:嵌入的文件内容在编译时确定,运行时无法修改。敏感数据仍会出现在二进制文件中,建议结合加密措施。

