Skip to content

Allow passing a callable for api_key #1465

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"
    ),
)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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