2
0

webidentity.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package aws
  2. import (
  3. "context"
  4. "fmt"
  5. "golang.org/x/oauth2/google"
  6. "google.golang.org/api/idtoken"
  7. "google.golang.org/api/option"
  8. )
  9. type IDTokenRetriever interface {
  10. GetIdentityToken() ([]byte, error)
  11. Validate() error
  12. Sanitize() IDTokenRetriever
  13. Equals(IDTokenRetriever) bool
  14. }
  15. type GoogleIDTokenRetriever struct {
  16. Aud string `json:"aud"`
  17. }
  18. func (gitr GoogleIDTokenRetriever) GetIdentityToken() ([]byte, error) {
  19. ctx := context.Background()
  20. res := []byte{}
  21. credentials, err := google.FindDefaultCredentials(ctx)
  22. if err != nil {
  23. return res, fmt.Errorf("failed to find default credentials: %v", err)
  24. }
  25. ts, err := idtoken.NewTokenSource(ctx, gitr.Aud, option.WithCredentials(credentials))
  26. if err != nil {
  27. return res, fmt.Errorf("failed to create ID token source: %w", err)
  28. }
  29. t, err := ts.Token()
  30. if err != nil {
  31. return res, fmt.Errorf("failed to receive ID token from metadata server: %w", err)
  32. }
  33. return []byte(t.AccessToken), nil
  34. }
  35. func (gitr GoogleIDTokenRetriever) Validate() error {
  36. if gitr.Aud == "" {
  37. return fmt.Errorf("GoogleIDTokenRetriever: missing audience configuration")
  38. }
  39. return nil
  40. }
  41. func (gitr GoogleIDTokenRetriever) Equals(other IDTokenRetriever) bool {
  42. that, ok := other.(*GoogleIDTokenRetriever)
  43. if !ok {
  44. return false
  45. }
  46. if gitr.Aud != that.Aud {
  47. return false
  48. }
  49. return true
  50. }
  51. func (gitr GoogleIDTokenRetriever) Sanitize() IDTokenRetriever {
  52. return &GoogleIDTokenRetriever{
  53. Aud: gitr.Aud,
  54. }
  55. }