Path: blob/main/components/gitpod-cli/cmd/idp-gcloud-token.go
2498 views
// Copyright (c) 2024 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package cmd56import (7"context"8"encoding/json"9"fmt"10"os"11"path"12"time"1314"github.com/golang-jwt/jwt/v5"15"github.com/spf13/cobra"16)1718var idpGCloudTokenOpts struct {19Audience []string20}2122var idpGCloudTokenCmd = &cobra.Command{23Use: "gcloud-token",24Short: "Requests a gcloud format ID token for this workspace",25RunE: func(cmd *cobra.Command, args []string) (err error) {26cmd.SilenceUsage = true27if len(idpGCloudTokenOpts.Audience) == 0 {28return fmt.Errorf("missing --audience or GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE env var")29}30ctx, cancel := context.WithTimeout(cmd.Context(), 5*time.Second)31defer cancel()3233defer func() {34if err != nil {35out, _ := json.Marshal(map[string]any{36"version": 1,37"success": false,38"code": "401",39"message": err.Error(),40})41fmt.Print(string(out))42}43}()4445tkn, err := idpToken(ctx, idpGCloudTokenOpts.Audience, "")46if err != nil {47return err48}4950token, _, err := jwt.NewParser().ParseUnverified(tkn, jwt.MapClaims{})51if err != nil {52return err53}5455expirationDate, err := token.Claims.GetExpirationTime()56if err != nil {57return err58}59out, err := json.Marshal(map[string]any{60"version": 1,61"success": true,62"token_type": "urn:ietf:params:oauth:token-type:id_token",63"id_token": tkn,64"expiration_time": expirationDate.Unix(),65})66if err != nil {67return err68}69fmt.Print(string(out))70if output := os.Getenv("GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE"); output != "" {71err := os.MkdirAll(path.Dir(output), 0600)72if err != nil {73// omit error74return nil75}76// omit error77_ = os.WriteFile(output, out, 0600)78}79return nil80},81}8283func init() {84idpCmd.AddCommand(idpGCloudTokenCmd)85audience := []string{}86if aud := os.Getenv("GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE"); aud != "" {87audience = append(audience, aud)88}89idpGCloudTokenCmd.Flags().StringArrayVar(&idpGCloudTokenOpts.Audience, "audience", audience, "audience of the ID token")90}919293