2 回答

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
在深入研究了Google 的 Oauth 協(xié)議和OAuth2之后,我發(fā)現(xiàn) Golang 中的庫并沒有完全遵循 google 的 OAuth2 協(xié)議。
谷歌規(guī)范中的流程:在 HTTP 客戶端(使用服務(wù)帳戶)中生成和簽署 JWT --> 發(fā)送到谷歌的服務(wù)器 --> 獲取新的簽名 JWT --> 將新令牌用于其他請(qǐng)求
Golang lib:生成并簽署 JWT --> 將此令牌用于其他請(qǐng)求
令人驚訝的是,Nodejs 庫正確處理了流程,而 Golang 庫卻沒有。我將我的調(diào)查總結(jié)為一篇博文。
對(duì)于那些想要簡短回答的人,這是我的實(shí)現(xiàn)(我將一些部分移到了公共倉庫中):
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))
}

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
我編寫了一個(gè)名為token-generator的開源應(yīng)用程序。它在 Go 中,我生成簽名身份令牌,以便能夠調(diào)用私有 Cloud Run 和 Cloud Function。
隨意使用它或復(fù)制您自己的應(yīng)用所需的核心代碼!如果您愿意,我們可以在這里討論或在 GitHub 上打開一個(gè)問題。
- 2 回答
- 0 關(guān)注
- 147 瀏覽
添加回答
舉報(bào)