Skip to content
GitHub

Auth service

Rafiki’s auth service provides you with a reference implementation of an Open Payments authorization server. You can use the auth service as an alternative to developing your own in-house service for grant authorization and authentication.

The authorization server is responsible for:

  • Authorizing incoming requests from clients (e.g., third-party applications) to create payments and quotes on the backend
  • Relaying information about the interaction to the client and recording the response
  • Issuing access tokens to clients and communicating with the resource server to validate each client’s access rights

Requirements

The following are required when using the auth service.

  • A Redis database for storing session data
  • A Postgres database, separate from the backend service’s database, to store auth-related resources (grants, access tokens, and interactions)
  • Integration with an identity provider

You must also set the environment variables for the auth service.

Incoming client auth requests

When a request comes from a client with an account known to your local instance of Rafiki, the auth service uses data stored in the auth service’s Postgres database.

When a request comes from a client registered with another instance of Rafiki, the auth service resolves the client’s key endpoint (e.g., https://wallet.example.com/alice/jwks.json) to retrieve the client’s public keys, then filters out the correct key using the key id (kid) in the client’s signature.

Review the Open Payments documentation for more information about client keys.

Identity provider (IdP)

An identity provider (IdP) is a system or service that manages user authentication, identity information, and consent. When you use your Google account credentials to “Sign in with Google” on an app or website, for example, Google is acting as your identity provider.

Integration with an IdP is required when using Rafiki’s auth service because the Open Payments standard requires interactive outgoing payment grant requests. In an interactive request, there must be explicit interaction by an individual (e.g., a client’s end-user) to approve or deny the grant. In this case, the grant must be explicitly approved before an outgoing payment is created.

For more information about interactive grants and how they work with identity providers, review our Identity Provider page and the Grant negotiation and authorization page in the Open Payments docs.

GraphQL Auth Admin API

The auth service exposes a GraphQL Auth Admin API to manage auth-related resources, such as Open Payments grants.

Environment variables

Required

VariableHelm value nameDefaultDescription
AUTH_DATABASE_URLauth.postgresql.host,
auth.postgresql.port,
auth.postgresql.username,
auth.postgresql.database,
auth.postgresql.password
postgresql://postgres:password@localhost:5432/auth_developmentThe URL of the Postgres database storing your Open Payments grant data. For Helm, these components are provided individually.
AUTH_SERVER_URLauth.server.domainundefinedThe public endpoint for your Rafiki instance’s public Open Payments routes.
COOKIE_KEYauth.cookieKeyundefinedThe koa KeyGrip key that is used to sign cookies for an interaction session.
IDENTITY_SERVER_URLauth.identityServer.domainundefinedThe specific URL of your identity provider’s user-facing consent screen.
IDENTITY_SERVER_SECRETauth.identityServer.secretundefinedThe API key for fetching your identity (IdP) server endpoint.
REDIS_URLauth.redis.host,
auth.redis.port
redis://127.0.0.1:6379The connection URL for Redis. For Helm, these components are provided individually.

Optional

VariableHelm value nameDefaultDescription
ACCESS_TOKEN_DELETION_DAYSauth.accessToken.deletionDays30The days until expired and/or revoked access tokens are deleted.
ACCESS_TOKEN_EXPIRY_SECONDSauth.accessToken.expirySeconds600 (10 minutes)The expiry time, in seconds, for access tokens.
ADMIN_API_SIGNATURE_VERSIONauth.adminApi.signatureVersion1The version of the request signing algorithm used to generate signatures.
ADMIN_API_SIGNATURE_TTL_SECONDSauth.adminAPI.signatureTtlSeconds30The TTL, in seconds, for which a request’s signature will be valid.
ADMIN_PORTauth.port.admin3003The port of your Rafiki Auth Admin API server.
AUTH_PORTauth.port.auth3006The port of your Open Payments authorization server.
DATABASE_CLEANUP_WORKERSauth.workers.cleanup1The number of workers processing expired or revoked access tokens.
ENABLE_MANUAL_MIGRATIONSauth.enableManualMigrationsfalseWhen true, you must run the auth Postgres database manually with the command npm run knex – migrate:latest –envproduction
INCOMING_PAYMENT_INTERACTIONauth.interaction.incomingPaymentfalseWhen true, incoming Open Payments grant requests are interactive
INTERACTION_EXPIRY_SECONDSauth.interactionExpirySeconds600 (10 minutes)The time, in seconds, for which a user can interact with a grant request before the request expires.
INTERACTION_PORTauth.port.interaction3009The port number of your Open Payments interaction-related APIs.
INTROSPECTION_PORTauth.port.introspection3007The port of your Open Payments access token introspection server.
LIST_ALL_ACCESS_INTERACTIONauth.interaction.listAlltrueWhen true, grant requests that include a list-all action will require interaction. In these requests, the client asks to list resources that it did not create.
LOG_LEVELauth.logLevelinfoPino log level
NODE_ENVauth.nodeEnvdevelopmentThe type of node environment: development, test, or production.
QUOTE_INTERACTIONauth.interaction.quotefalseWhen true, quote grants are interactive.
REDIS_TLS_CA_FILE_PATHauth.redis.tlsCaFile''Redis TLS config
REDIS_TLS_CERT_FILE_PATHauth.redis.tlsCertFile''Redis TLS config
REDIS_TLS_KEY_FILE_PATHauth.redis.tlsKeyFile''Redis TLS config
TRUST_PROXYauth.trustProxyfalseWhen true, the X-Forwarded-Proto header is used to determine if connections are secure.
WAIT_SECONDSauth.grant.waitSeconds5The wait time, in seconds, included in a grant request response (grant.continue).