pub struct ConnectTokenEncoder { /* private fields */ }
Expand description

Represents a private key used to create JWT tokens for use with App Store Connect.

See https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api and https://developer.apple.com/documentation/appstoreconnectapi/generating_tokens_for_api_requests for more details.

This entity holds the necessary metadata to issue new JWT tokens.

App Store Connect API tokens/JWTs are derived from:

  • A key identifier. This is a short alphanumeric string like DEADBEEF42.
  • An issuer ID. This is likely a UUID.
  • A private key. Likely ECDSA.

All these are issued by Apple. You can log in to App Store Connect and see/manage your keys at https://appstoreconnect.apple.com/access/api.

Implementations§

Construct an instance from an EncodingKey instance.

This is the lowest level API and ultimately what all constructors use.

Examples found in repository?
src/api_token.rs (line 71)
68
69
70
71
72
73
74
75
76
77
78
79
    pub fn from_ecdsa_der(key_id: String, issuer_id: String, der_data: &[u8]) -> Result<Self> {
        let encoding_key = EncodingKey::from_ec_der(der_data);

        Ok(Self::from_jwt_encoding_key(key_id, issuer_id, encoding_key))
    }

    /// Create a token from a PEM encoded ECDSA private key.
    pub fn from_ecdsa_pem(key_id: String, issuer_id: String, pem_data: &[u8]) -> Result<Self> {
        let encoding_key = EncodingKey::from_ec_pem(pem_data)?;

        Ok(Self::from_jwt_encoding_key(key_id, issuer_id, encoding_key))
    }

Construct an instance from a DER encoded ECDSA private key.

Examples found in repository?
src/api_key.rs (line 126)
123
124
125
126
127
    fn try_from(value: UnifiedApiKey) -> Result<Self> {
        let der = base64::decode(value.private_key).context("invalid unified api key")?;

        Self::from_ecdsa_der(value.key_id, value.issuer_id, &der)
    }

Create a token from a PEM encoded ECDSA private key.

Examples found in repository?
src/api_token.rs (line 89)
82
83
84
85
86
87
88
89
90
    pub fn from_ecdsa_pem_path(
        key_id: String,
        issuer_id: String,
        path: impl AsRef<Path>,
    ) -> Result<Self> {
        let data = std::fs::read(path.as_ref())?;

        Self::from_ecdsa_pem(key_id, issuer_id, &data)
    }

Create a token from a PEM encoded ECDSA private key in a filesystem path.

Examples found in repository?
src/api_token.rs (line 114)
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
    pub fn from_api_key_id(key_id: String, issuer_id: String) -> Result<Self> {
        let mut search_paths = vec![std::env::current_dir()?.join("private_keys")];

        if let Some(home) = dirs::home_dir() {
            search_paths.extend([
                home.join("private_keys"),
                home.join(".private_keys"),
                home.join(".appstoreconnect").join("private_keys"),
            ]);
        }

        // AuthKey_<apiKey>.p8
        let filename = format!("AuthKey_{key_id}.p8");

        for path in search_paths {
            let candidate = path.join(filename.as_str());

            if candidate.exists() {
                return Self::from_ecdsa_pem_path(key_id, issuer_id, candidate);
            }
        }

        Err(MissingApiKey.into())
    }

Attempt to construct in instance from an API Key ID.

e.g. DEADBEEF42. This looks for an AuthKey_<id>.p8 file in default search locations like ~/.appstoreconnect/private_keys.

Mint a new JWT token.

Using the private key and key metadata bound to this instance, we issue a new JWT for the requested duration.

Examples found in repository?
src/lib.rs (line 59)
54
55
56
57
58
59
60
61
62
63
    pub fn get_token(&self) -> Result<String> {
        let mut token = self.token.lock().unwrap();

        // TODO need to handle token expiration.
        if token.is_none() {
            token.replace(self.connect_token.new_token(300)?);
        }

        Ok(token.as_ref().unwrap().clone())
    }

Trait Implementations§

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
The type returned in the event of a conversion error.
Performs the conversion.

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Should always be Self
The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.
Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more