contributing/workflow_samples/auth_api_key/README.md
This sample demonstrates how to use auth_config on a FunctionNode to require user authentication before the node runs.
When a node has auth_config, the workflow automatically:
adk_request_credential FunctionCall eventThe ADK web UI (adk web) handles step 3 automatically — it recognizes auth
requests and presents an auth dialog. If you use a custom client, you need to
handle the adk_request_credential FunctionCall and respond with the credential
yourself.
This sample uses API key authentication (the simplest credential type).
This sample uses a mock weather lookup. No external API key or server is needed. When the auth UI prompts for a key, you can enter any value (e.g., my-test-key-123).
Send any message (e.g., go) to start the workflow.
[ START ]
|
v
[fetch_weather] <-- pauses for auth on first run
|
v
[summarize]
Define an AuthConfig with the auth scheme and credential type:
from google.adk.auth.auth_tool import AuthConfig
from google.adk.auth.auth_credential import AuthCredential, AuthCredentialTypes
auth_config = AuthConfig(
auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}),
raw_auth_credential=AuthCredential(
auth_type=AuthCredentialTypes.API_KEY,
api_key='placeholder',
),
credential_key='weather_api_key',
)
Use the @node decorator with auth_config and rerun_on_resume=True:
@node(auth_config=auth_config, rerun_on_resume=True)
def fetch_weather(ctx: Context):
...
Inside the function, retrieve the credential from ctx:
def fetch_weather(ctx: Context):
cred = ctx.get_auth_response(auth_config)
api_key = cred.api_key
# Use api_key to call your API...
The same auth_config pattern works with OAuth2 and OpenID Connect. The key
differences:
OAuth2 (from fastapi.openapi.models) instead of
APIKey. Configure the authorization and token URLs in the OAuth2 flows.auth_type=AuthCredentialTypes.OAUTH2 and provide
client_id, client_secret, and redirect_uri in the oauth2 field.AuthConfig response back. No special
handling is needed in the node.AuthHandler.exchange_auth_token().from fastapi.openapi.models import OAuth2, OAuthFlowAuthorizationCode, OAuthFlows
auth_config = AuthConfig(
auth_scheme=OAuth2(
flows=OAuthFlows(
authorizationCode=OAuthFlowAuthorizationCode(
authorizationUrl='https://provider.com/authorize',
tokenUrl='https://provider.com/token',
scopes={'read': 'Read access'},
)
)
),
raw_auth_credential=AuthCredential(
auth_type=AuthCredentialTypes.OAUTH2,
oauth2=OAuth2Auth(
client_id='YOUR_CLIENT_ID',
client_secret='YOUR_CLIENT_SECRET',
redirect_uri='http://localhost:8000/callback',
),
),
credential_key='my_oauth_credential',
)