Подключите разработчика Apple Store подключиться с помощью подписанного токена - PullRequest
0 голосов
/ 02 апреля 2019

я использую библиотеку jose, предоставленную на сайте http://jwt.io, пытаюсь создать токен jwt, используя эту библиотеку, но сгенерированный токен сообщает неверную подпись при вставке на сайт http://jwt.io, а также при попытке скручивания Apple Developer Connect 401 несанкционированный ответ! я не понимаю, что является причиной проблемы.

// Create the Claims, which will be the content of the JWT
        JwtClaims claims = new JwtClaims();
        claims.setIssuer("69a6de78-7188-47e3-e053-5b8c7c11a4d1");  // who creates the token and signs it
        claims.setAudience("appstoreconnect-v1"); // to whom the token is intended to be sent
        claims.setExpirationTimeMinutesInTheFuture(20); // time when the token will expire (10 minutes from now)
        claims.setIssuedAtToNow();
        claims.setGeneratedJwtId(); // a unique identifier for the token
     // Generate an EC key pair, which will be used for signing and verification of the JWT, wrapped in a JWK
        EllipticCurveJsonWebKey senderJwk = EcJwkGenerator.generateJwk(EllipticCurves.P256);
        // Give the JWK a Key ID (kid), which is just the polite thing to do
        senderJwk.setKeyId("-----BEGIN PRIVATE KEY-----\n" + 
                "*******************" + 

                "-----END PRIVATE KEY-----");
       // So we first create a JsonWebSignature object.
        JsonWebSignature jws = new JsonWebSignature();
        // The payload of the JWS is JSON content of the JWT Claims
        jws.setPayload(claims.toJson());
        // The JWT is signed using the sender's private key
        jws.setKey(senderJwk.getPrivateKey());
        // Set the Key ID (kid) header because it's just the polite thing to do.
        // We only have one signing key in this example but a using a Key ID helps
        // facilitate a smooth key rollover process
        jws.setKeyIdHeaderValue(senderJwk.getKeyId());
        // Set the signature algorithm on the JWT/JWS that will integrity protect the claims
        jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_AND_SHA256);
        jws.setHeader("typ","jwt");
        // Sign the JWS and produce the compact serialization, which will be the inner JWT/JWS
        // representation, which is a string consisting of three dot ('.') separated
        // base64url-encoded parts in the form Header.Payload.Signature
        String outJwt = jws.getCompactSerialization();
        // Now you can do something with the JWT. Like send it to some other party
        // over the clouds and through the interwebs.
        System.out.println("JWT: " + outJwt);

curl -v -H 'Авторизация: Носитель [подписанный токен]' «https://api.appstoreconnect.apple.com/v1/apps"

1 Ответ

0 голосов
/ 02 апреля 2019

Я не знаком с библиотекой, но похоже, что вы подписываете токен новым, случайно сгенерированным ключом каждый раз, когда запускаете код:

EllipticCurveJsonWebKey senderJwk = EcJwkGenerator.generateJwk(EllipticCurves.P256);

Похоже, вы также устанавливаете идентификатор ключа как закрытый ключ в кодировке Base-64 (возможно, тот, который вы намеревались использовать?). Идентификатор ключа не является ключом, он просто используется для поиска в хранилище ключей, например ( Согласно Apple , идентификатор ключа для их API должен быть «Ваш закрытый ключ» ID из App Store Connect ").

Так что я думаю, причина того, что вы получаете ошибку «неверная подпись», заключается в том, что вы каждый раз подписываете токен новым ключом, а не тот, который вы используете для его проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...