【问题标题】:How to verify JWT?如何验证 JWT?
【发布时间】:2018-06-18 05:25:43
【问题描述】:

我不确定 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 是什么,我如何将它从处理程序本身传递给函数?

【问题讨论】:

    标签: firebase google-app-engine go firebase-authentication jwt


    【解决方案1】:

    您已经在 InitializeAppWithServiceAccount() 函数中初始化了 firebase.App。您只需要将返回值传递给您的处理程序。

    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 上下文而不是背景上下文。

    【讨论】:

      猜你喜欢
      • 2014-05-29
      • 2019-11-29
      • 2020-03-27
      • 2018-10-16
      • 2016-07-10
      • 2020-03-07
      • 1970-01-01
      • 2020-11-07
      • 2023-03-12
      相关资源
      最近更新 更多