Как подписать JWT с помощью метода ECDSA с использованием пакета jwt golang - Войдите в систему с помощью Apple - PullRequest
1 голос
/ 05 августа 2020

При интеграции входа с Apple вы создаете ключ в своей учетной записи разработчика Apple. Это файл с именем AuthKey_3JMD5K6.p8 и выглядит как

-----BEGIN PRIVATE KEY-----
MasdfjalskdasdflaASDFAadsflkjaADSFAewfljasdfljkasefasdflkjasdf
asdfljkasdfASDFASDFoiqretasdoiyjlfsbgREtaREGSDFBREtafsrgAREGfdsgaregR
LKJIOEWFNLasdflkawefjoiasdflk
-----END PRIVATE KEY-----

, поэтому я сделал var appleKey := MasdfjalskdasdflaASDFAadsflkjaADSFAewfljasdfljkasefasdflkjasdf asdfljkasdfASDFASDFoiqretasdoiyjlfsbgREtaREGSDFBREtafsrgAREGfdsgaregRLKJIOEWFNLasdflkawefjoiasdflk

Я подписал jwt с помощью метода HMA C -SHA раньше что довольно просто, но я не знаю, как подписать jwt с помощью метода ECDSA.

Я написал свой код так же, как и для метода HMA C -SHA, но получил ошибку key is of invalid type

Итак, используя библиотеку jwt для golang, как я могу подписать свой jwt методом ECDSA?

Мой код

  // generate client secret jwt using apple key
  expirationTime := time.Now().Add(5 * time.Minute)
  claims := &Claims{
    StandardClaims: jwt.StandardClaims {
      Audience: "https://appleid.apple.com",
      Subject: "com.app.ios",
      Issuer: string(appleTeamId),
      ExpiresAt: expirationTime.Unix(),
      IssuedAt: time.Now().Unix(),
    },
  }
  appleToken := jwt.NewWithClaims(jwt.SigningMethodES256, claims)
  appleToken.Header["kid"] = appleKid

  signedAppleToken, err := appleToken.SignedString(appleKey)

Теперь я знаю, что это не так как вы это делаете, и это немного сложнее, но как это сделать?

Я нашел эту статью, в которой рассказывается, как это сделать вручную: http://p.agnihotry.com/post/validating_sign_in_with_apple_authorization_code/

Но я уже использую библиотеку jwt для golang для другой части токена: https://godoc.org/github.com/dgrijalva/jwt-go

1 Ответ

1 голос
/ 05 августа 2020

В github.com/dgrijalva/jwt-go s SigningMethodECDSA.Sign docs вы можете найти:

[...] Для этого метода подписи ключ должен быть ecdsa.PrivateKey struct

Итак, чтобы собрать пример:

    p8bytes, err := ioutil.ReadFile("SomeAppleKey.p8")
    if err != nil {
      log.Println(err)
      return
    }

    // Here you need to decode the Apple private key, which is in pem format
    block, _ := pem.Decode(p8bytes)
    // Check if it's a private key
    if block == nil || block.Type != "PRIVATE KEY" {
      log.Println("Failed to decode PEM block containing private key")
      return
    }
    // Get the encoded bytes
    x509Encoded := block.Bytes

    token := jwt.NewWithClaims(
        jwt.SigningMethodES256, // specific instance of `*SigningMethodECDSA`
        jwt.StandardClaims{
            // ...
        },
    )

    // Now you need an instance of *ecdsa.PrivateKey
    parsedKey, err := x509.ParsePKCS8PrivateKey(x509Encoded) // EDIT to x509Encoded from p8bytes
    if err != nil {
        panic(err)
    }

    ecdsaPrivateKey, ok := parsedKey.(*ecdsa.PrivateKey)
    if !ok {
        panic("not ecdsa private key")
    }

    // Finally sign the token with the value of type *ecdsa.PrivateKey
    signed, err := token.SignedString(ecdsaPrivateKey)
    if err != nil {
        panic(err)
    }
    fmt.Println(signed) // the signed JWT

Примечание: как показано в фрагменте кода, поскольку файл ключей от Apple находится в формате PEM, сначала его нужно декодировать

...