我不确定Google文档中的示例。如何在Google App引擎灵活服务中验证Firebase生成的JWT?
main.go
:
// ...
func main () {
InitializeAppWithServiceAccount()
go lib.GetStockData()
http.HandleFunc("/_ah/someendPoint", SomeHandler)
}
func InitializeAppWithServiceAccount() *firebase.App {
// [START initialize_app_service_account]
opt := option.WithCredentialsFile("keystore/someapp-firebase-adminsdk-1ts1k-1fbbbad63f.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
log.Fatalf("error initializing app: %v\n", err)
}
return app
}
func someHandler(w http.ResponseWriter, r *http.Request) {
// Set content type:
w.Header().Set("Content-Type", "application/json")
if r.Header != nil {
ReqToken := r.Header.Get("Authorization")
splitToken := strings.Split(ReqToken, "Bearer")
ReqToken = splitToken[1]
fmt.Println(ReqToken) // Correctly prints the JWT
// Verify JWT
// If it's invalid, return?
// verifyIDToken(??, reqToken)
enc := json.NewEncoder(w)
err := enc.Encode(somedata)
fmt.Println("request made")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
http.Error(w, "Unauthorized", http.StatusUnauthorized)
}
根据他们的文档,您可以使用以下函数来验证ID令牌?但是我作为应用程序传递了什么?文档并没有真正说出来。
func verifyIDToken(app *firebase.App, idToken string) *auth.Token {
// [START verify_id_token]
client, err := app.Auth(context.Background())
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
}
token, err := client.VerifyIDToken(idToken)
if err != nil {
log.Fatalf("error verifying ID token: %v\n", err)
}
log.Printf("Verified ID token: %v\n", token)
// [END verify_id_token]
return token
}
显然,idToken
是来自处理程序的令牌。但是什么是app *firebase.App
以及如何将它从处理程序本身传递给函数?
答案 0 :(得分:0)
您已在firebase.App
功能中初始化InitializeAppWithServiceAccount()
。您只需将返回值传递给处理程序。
conf := firebase.Config{
ProjectID: "my-project-id",
}
app, err := firebase.NewApp(context.Background(), &conf)
if err != nil {
log.Fatalln(err)
}
handler := func(w http.ResponseWriter, r *http.Request) {
client, err := app.Auth(context.Background())
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
token := getTokenFromReq(r)
t, err := client.VerifyIDToken(token)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
w.Write([]byte("token verified"))
}
在这个例子中,我没有使用服务帐户(这可能也是你想要的)。由于这是在GAE上,请确保传递GAE上下文而不是背景上下文。