
在使用go语言与google服务进行交互时,服务账户(service account)提供了一种安全、无需用户参与的认证方式。通过jwt授权,我们可以使用服务账户的私钥直接生成访问令牌,进而调用google api。
在开始之前,请确保您具备以下条件:
首先,我们需要获取Go语言中用于OAuth2和JWT认证的库。本教程将使用code.google.com/p/goauth2包,它是Google官方早期提供的OAuth2客户端库。
在终端中执行以下命令:
go get code.google.com/p/goauth2/oauth
在Google Cloud Console中,导航到“IAM & Admin” -> “Service Accounts”。
立即学习“go语言免费学习笔记(深入)”;
goauth2库在处理私钥时,需要的是PEM格式的未加密RSA私钥。您下载的P12文件是加密的且可能包含证书。我们需要使用openssl将其转换为PEM格式的纯RSA私钥。
假设您的P12文件名为file.p12,执行以下命令:
openssl pkcs12 -in file.p12 -nocerts -out key.pem -nodes
执行此命令后,openssl可能会要求您输入P12文件的密码(通常是notasecret,如果您在下载时没有指定)。成功后,key.pem文件将包含未加密的RSA私钥。请确保删除key.pem文件中可能存在的额外文本(例如,Bag Attributes或-----BEGIN/END CERTIFICATE-----之间的内容,只保留-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----之间的内容)。
现在,我们可以编写Go代码来使用这些凭据生成访问令牌。
package main
import (
"code.google.com/p/goauth2/oauth/jwt" // 导入JWT包
"flag"
"fmt"
"io/ioutil"
"net/http" // 使用net/http代替旧的http包
)
var (
serviceEmail = flag.String("service_email", "", "OAuth service email.")
keyPath = flag.String("key_path", "key.pem", "Path to unencrypted RSA private key file.")
scope = flag.String("scope", "", "Space separated scopes.")
)
// fetchToken 函数用于获取Google服务的访问令牌
func fetchToken() (string, error) {
// 1. 读取PEM格式的私钥文件
keyBytes, err := ioutil.ReadFile(*keyPath)
if err != nil {
return "", fmt.Errorf("无法读取私钥文件: %v", err)
}
// 2. 创建JWT令牌配置
// 参数: 服务账户邮箱, 授权范围, 私钥字节
t := jwt.NewToken(*serviceEmail, *scope, keyBytes)
// 3. 创建HTTP客户端
c := &http.Client{}
// 4. 断言并获取访问令牌
// t.Assert(c) 会向Google OAuth2服务器发送请求,交换JWT为OAuth2访问令牌
o, err := t.Assert(c)
if err != nil {
return "", fmt.Errorf("无法获取访问令牌: %v", err)
}
return o.AccessToken, nil
}
func main() {
flag.Parse() // 解析命令行参数
if *serviceEmail == "" || *scope == "" {
fmt.Println("错误: 必须指定服务账户邮箱和授权范围。")
flag.PrintDefaults()
return
}
token, err := fetchToken()
if err != nil {
fmt.Printf("错误: %v\n", err)
} else {
fmt.Printf("成功获取访问令牌: %v\n", token)
}
}
将上述代码保存为main.go。在命令行中,使用以下方式运行:
go run main.go --service_email="your-service-account@your-project-id.iam.gserviceaccount.com" --key_path="key.pem" --scope="https://www.googleapis.com/auth/cloud-platform"
请将your-service-account@your-project-id.iam.gserviceaccount.com替换为您的服务账户邮箱,key.pem替换为您的私钥文件路径,并根据您的需求修改--scope参数。
如果一切顺利,您将看到控制台输出一个长字符串,即为成功获取的访问令牌。
本教程详细指导了如何在Go语言中使用JWT机制对Google服务账户进行授权。通过将P12私钥转换为PEM格式,并利用goauth2/oauth/jwt包,我们能够成功地获取访问令牌,为您的Go应用程序与Google服务的交互提供了坚实的认证基础。请务必注意私钥的安全性以及授权范围的合理配置,以确保您的应用程序安全可靠。
以上就是Go语言中通过JWT授权Google服务账户的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号