亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用服務帳戶在 Golang 中驗證對 Cloud Function 的客戶端調用

使用服務帳戶在 Golang 中驗證對 Cloud Function 的客戶端調用

Go
守候你守候我 2022-06-01 12:27:23
我將自己的云功能部署到 GCP。在云功能上,我啟用了使用 Google 服務帳戶進行身份驗證。我需要編寫一個 Golang 代碼來調用這個云函數。我用 Nodejs 完成了同樣的目的,但不能讓 Golang 工作。這是我的 Nodejs 代碼(工作):const {GoogleAuth} = require('google-auth-library');const targetAudience = "cloud-function-url"async function run() {    const auth = new GoogleAuth();    const client = await auth.getIdTokenClient(targetAudience);    const res = await client.request({ url });    console.info(res.data);}我的 Golang 代碼:import  "golang.org/x/oauth2/google"func getToken() (err error) {    scope := "https://www.googleapis.com/auth/cloud-platform"    client, err := google.DefaultClient(context.Background(), scope)    if err != nil {        return    }    res, err := client.Get("cloud-function-url")    if err != nil {        return    }    fmt.Println(res)    return}我也嘗試自定義要添加的代碼targetAudience,但它也不起作用baseUrl := "your-cloudfunction-baseurl"ctx := context.Background()targetAudience := baseUrlcredentials, err := google.FindDefaultCredentials(ctx)if err != nil {    fmt.Printf("cannot get credentials: %v", err)    os.Exit(1)}tokenSrc, err := google.JWTAccessTokenSourceFromJSON(credentials.JSON, targetAudience)if err != nil {    fmt.Printf("cannot create jwt source: %v", err)    os.Exit(1)}client := oauth2.NewClient(context.Background(), tokenSrc)if err != nil {    return}res, err := client.Get(baseUrl + "sub-url")if err != nil {    return}我已檢查并確保我的服務帳戶已正確加載。在上述兩種情況下,我都收到了401 "The access token could not be verified"
查看完整描述

2 回答

?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

在深入研究了Google 的 Oauth 協議OAuth2之后,我發現 Golang 中的庫并沒有完全遵循 google 的 OAuth2 協議。

  • 谷歌規范中的流程:在 HTTP 客戶端(使用服務帳戶)中生成和簽署 JWT --> 發送到谷歌的服務器 --> 獲取新的簽名 JWT --> 將新令牌用于其他請求

  • Golang lib:生成并簽署 JWT --> 將此令牌用于其他請求

令人驚訝的是,Nodejs 庫正確處理了流程,而 Golang 庫卻沒有。我將我的調查總結為一篇博文

對于那些想要簡短回答的人,這是我的實現(我將一些部分移到了公共倉庫中):

import (

    "context"

    "fmt"

    "io/ioutil"

    "os"


    "github.com/CodeLinkIO/go-cloudfunction-auth/cloudfunction"


    "golang.org/x/oauth2/google"

)


func main() {

    baseUrl := "your-cloudfunction-baseurl"

    ctx := context.Background()

    targetAudience := baseUrl

    credentials, err := google.FindDefaultCredentials(ctx)

    if err != nil {

        fmt.Printf("cannot get credentials: %v", err)

        os.Exit(1)

    }


    jwtSource, err := cloudfunction.JWTAccessTokenSourceFromJSON(credentials.JSON, targetAudience)

    if err != nil {

        fmt.Printf("cannot create jwt source: %v", err)

        os.Exit(1)

    }


    client := cloudfunction.NewClient(jwtSource)

    res, err := client.Get(baseUrl + "/cloudfunction-sub-page")

    if err != nil {

        fmt.Printf("cannot fetch result: %v", err)

        os.Exit(1)

    }

    defer res.Body.Close()

    body, err := ioutil.ReadAll(res.Body)

    if err != nil {

        fmt.Printf("cannot read response: %v", err)

        os.Exit(1)

    }

    println(string(body))

}


查看完整回答
反對 回復 2022-06-01
?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

我編寫了一個名為token-generator的開源應用程序。它在 Go 中,我生成簽名身份令牌,以便能夠調用私有 Cloud Run 和 Cloud Function。

隨意使用它或復制您自己的應用所需的核心代碼!如果您愿意,我們可以在這里討論或在 GitHub 上打開一個問題。


查看完整回答
反對 回復 2022-06-01
  • 2 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號