我有一个通过 Firebase 进行身份验证的用户,我想做的是在后端(Google 云平台/Go)对该用户进行身份验证。我按照 Firebase
上的文档进行操作我在前端获取 idToken,并使用以下代码将标头上的令牌发送到在我的本地主机上运行的服务器。
idToken = firebase.auth().currentUser.getIdToken()
axios({
method: 'POST',
url: 'https://localhost:8080/users',
headers: {
'Authentication-Token': idToken
},
data: {
name: 'My name',
user_name: 'my_user_name',
email: '[email protected]'
}
})
在后端我想验证 idToken。我首先使用以下代码创建身份验证客户端。
opt := option.WithCredentialsFile("firebase_credential.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
client, err := app.Auth(context.Background())
使用客户端和前端的 idToken,我尝试了下面的代码。
t, err := client.VerifyIDToken(context.Background(), idToken)
这会引发
错误{"message":"Get https://www.googleapis.com/robot/v1/metadata/x509/[email protected]: oauth2: cannot fetch token: Post https://accounts.google.com/o/oauth2/token: not an App Engine context"}
我也尝试
curl
向服务器发出相同的请求,但出现了相同的错误。
curl -X POST -H "Authentication-Token:hogehogemytoken" -d '{"name":"My name","user_name":"my user name","email":"[email protected]"}' http://localhost:8080/users
我非常确定我发送了正确的令牌。 有什么想法吗?
看来在appengine标准环境中我必须使用
ctx := appengine.NewContext(r)
而不是
ctx := context.Background()
在 appengine 请求上下文中,必须处理更复杂的事情,因为它们是 API 请求上下文。另一方面,常规
context.Background()
用于一般用途,因此与传入的 Http 请求无关。
所以我的解决方案是在 init.go 中传递
appengine.NewContext(r)
,如下所示。
r.POST("/users", func(c *gin.Context) { up.CreateUser(c, appengine.NewContext(c.Request)) })
将此应用程序引擎上下文传递给验证令牌。
func (c authClient) VerifyToken(ctx context.Context, token string) (IDToken, error) {
opt := option.WithCredentialsFile("firebasecredential.json")
app, err := firebase.NewApp(ctx, nil, opt)
if err != nil {
return nil, err
}
client, err := app.Auth(ctx)
if err != nil {
return nil, err
}
t, err := client.VerifyIDToken(ctx, token)
if err != nil {
return nil, err
}
return idToken{t}, nil
}
VerifyIDToken
不支持上下文,请检查文档
截至目前:
func (c *Client) VerifyIDToken(idToken string) (*Token, error)
您评论中的链接指向未来请求(FR),这意味着它尚未实现,所以这不是一个错误。
VerifyIDTokenAndCheckRevoked
做:
func (c *Client) VerifyIDTokenAndCheckRevoked(ctx context.Context, idToken string) (*Token, error)
我最近也遇到了同样的问题。问题不在于您的 Firebase 设置,而在于您如何从请求标头中提取令牌。
不要忘记过滤掉检索到的身份验证标头字符串中的“Bearer”部分。
tokenString := c.GetHeader("Authorization")
splitted := strings(tokenString, " ")
token := splitted[1]