Skip to content

Allow passing a callable for api_key #1465

Open
@ryancausey

Description

@ryancausey

Is your feature request related to a problem? Please describe.

I store my Stripe API keys in a secrets store service and retrieve them from this secrets store when I need to call the Stripe API. Given that I need to retrieve the keys from this secrets store, that the keys can be rotated, and that the secrets store access can be revoked as needed, I can't use a one time retrieval of the secret upon instantiation of the StripeClient. This leads me to a pattern where I instantiate the StripeClient with a fake key, and then use the per request options dictionary to specify the API key in each request.

Describe the solution you'd like

I would prefer to be able to pass a callable that returns a string to StripeClient in lieu of passing a string argument to api_key. This callable would then be invoked by the StripeClient on each call that needs it, allowing me to run any custom code I need such as fetching the API key from the secret store.

Describe alternatives you've considered

My current workaround is to instantiate the StripeClient with a fake key, and then specify api_key in the options dictionary on each request.

Additional context

stripe_client = StripeClient(
    api_key="fake_key_on_purpose",
    max_network_retries=5,
    http_client=HTTPXClient(allow_sync_methods=True),
)

# sometime later

stripe_client.products.create(
    params={
        "name": f"{permit_type_name} permit renewal fee",
        "default_price_data": {
            "currency": "USD",
            "recurring": {
                "interval": interval,
                "interval_count": renewal_configuration.interval,
            },
        },
        "unit_amount": renewal_configuration.renewal_fee,
    },
    options={
        "api_key": get_secret_value(secret_id=config("STRIPE_SECRET_ID")),
        "idempotency_key": f"{parsed_input.idempotency_key}-renewal"
    ),
)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions