Data Access is an open finance API platform designed to make it as easy as possible for you to share your institution’s financial data and access the data of other institutions using the latest FDX and OAuth standards.
In other words, you can stand up and manage your own financial data API in a fraction of the time it would take to build your own.
Data Access includes ready-made user interfaces for administration and authorization, as well as third-party management.
Data Access enables you to monitor and manage where customers are sharing your financial data and provides the tools to implement a more secure data-sharing experience with modern, token-based connectivity. It also empowers consumers to better understand, leverage, and benefit from their own financial data in a secure, reliable, and user-centric manner. Consumers gain visibility and control over which apps and institutions access their data by giving them the power to them to grant, modify, and revoke access at any time.
Data Access uses the Ruby on Rails and React frameworks.
API
customers
, accounts
, and transactions
.
User Interfaces
Hosting
Data Access delivers FDX-compliant data to third parties. It does this by translating data from your backend systems into FDX data. Because all backend systems are a little bit different, this requires building an adapter specific to your systems to do the translation.
MX generally performs the work of building an adapter, but partners are welcome to do this themselves as well.
In order for MX to build this adapter, we need a few of things.
In general, Data Access is hosted by MX using the Google Cloud Platform.
Settings and configurations specific to your needs can be made from within the Data Access administrator dashboard once MX has set up your environment. The sections that follow explain all the settings and configurations available to you, setup, and testing. We also cover how to embed the customer consent-management dashboard in your existing user interfaces.
There are several requirements for an MX-hosted implementation of Data Access.
MX will set up a generic development/testing environment for you using a temporary OIDC provider. This enables your admins and developers to log in and make changes to all settings (like host, branding, OIDC, etc) from within the administrator dashboard.
MX also provides a dummy data recipient called Centz for testing purposes. This will allow you to test workflows, sending and receiving data, etc.
You can access these settings from within the Data Access data-provider administration widget, for example, at https://access.your-domain.com/admin/settings
.
Setting | Description | Required? |
---|---|---|
Client auth method | Currently only basic authorization is supported. This must be configured separately for both admin and customer. |
Yes |
Client ID | The client ID issued by the authorization server. This must be configured separately for both admin and customer. |
Yes |
Client secret | The client secret issued by the authorization server. This must be configured separately for both admin and customer. |
Yes |
Colors | Your financial institution’s brand colors. These are used for link and button colors throughout Data Access UIs. | Yes |
Disable OAuth PKCE code challenge | This may be useful for debugging. Defaults to false . |
No |
Discovery URI | OIDC configuration metadata endpoint. This must be configured separately for both admin and customer. |
No |
Honeybadger API key | The API key provided by Honeybadger. Used to monitor system errors produced by the application. | No |
Institution name | The human-readable name of your financial institution. | Yes |
Logo | Your financial institution’s logo image. This image is shown in the end-user consent flow and the data recipient portal. | Yes |
OIDC debug | This enables extra logging for debugging. Defaults to false. | No |
Provider authorize URI | OAuth 2 authorization endpoint. This must be configured separately for both admin and customer. |
Required when no discovery URI is set. |
Provider token URI | OAuth 2 token endpoint. This must be configured separately for both admin and customer. |
Required when no discovery URI is set. |
Provider user info URI | OIDC user information endpoint. This must be configured separately for both admin and customer. |
Required when no discovery URI is set. |
Public URL | The public-facing URL of your Data Access instance without a trailing slash. This setting is used in the redirect URIs that must be registered for both admin and customer authorization services. Example: https://access.your-domain.com Admin authorization redirect URI: https://access.your-domain.com/admins/oidc_callback Customer authorization redirect URI: https://access.your-domain.com/customers/oidc_callback |
Yes |
Scope | Space-separated list of scope(s) needed for admin token generation. This must be configured separately for both admin and customer. |
Yes |
Shared secret | This is a symmetric key used in AES256 encryption for the customer consent-management flow. It must be a random 32 bytes represented as a Base64 string. For example, Jx2qSDdJy6BJfkjH7PPZ6OPnjbjd/qNI2vgbCRT30Qw= . The example given here is valid and can be used in development and testing environments, but cannot be used in production. Production shared secrets can either be provided securely by MX or generated on your your end. |
Yes |
Data Access includes a customer authorization dashboard which enables customers to manage the apps and intermediaries they have chosen to give permission to. This dashboard is designed to be embedded within your customer-facing web or mobile experience and accessible at https://access.your-domain.com/embed/authorizations
.
Access to this endpoint is authenticated with nested JSON Web Tokens (JWTs) which are both signed and then encrypted. This allows you to authenticate customers and display the dashboard without the need to set a cookie.
The process is as follows:
Before creating a customer JWT, you’ll first need to prove that you’re authorized to do so. This step explains how to create an admin JWT using JSON Web Encryption (JWE).
You’ll need to use an appropriate encryption library to generate an admin JWT using your shared secret (for example, Jx2qSDdJy6BJfkjH7PPZ6OPnjbjd/qNI2vgbCRT30Qw=
) and the unique identifier for the customer. MX strongly recommends using a Javascript Object Signing and Encryption (JOSE) library to handle JWE creation. There are many libraries and implementations available for different languages. Javascript and Ruby examples are shown here. Data Access uses AES256-GCM.
The encrypted object should contain the sub
claim, for example {"sub": "sub-id-1234"}
. This is the same as the subject identifier outlined in the OIDC spec. It is the unique identifier for that user in your system.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
require "jose"
class JWE
def self.encrypt(obj)
::JOSE::JWE.block_encrypt(key, obj.to_json, "alg" => "dir", "enc" => "A256GCM").compact
end
def self.decrypt(encrypted)
::JSON.parse(::JOSE::JWE.block_decrypt(key, encrypted).first)
end
def self.key
::JOSE::JWK.from_oct(Base64.decode64(SHARED_SECRET))
end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const crypto = require('crypto');
const { CompactEncrypt } = require('jose/jwe/compact/encrypt');
const { compactDecrypt } = require('jose/jwe/compact/decrypt');
class SecureMessageService {
constructor(key) {
this.encoder = new TextEncoder();
this.decoder = new TextDecoder();
this.key = crypto.createSecretKey(Buffer.from(key, 'base64'));
}
async encrypt(obj) {
return await new CompactEncrypt(this.encoder.encode(JSON.stringify(obj)))
.setProtectedHeader({ alg: 'dir', enc: 'A256GCM' })
.encrypt(this.key);
}
async decrypt(encrypted) {
const { plaintext } = await compactDecrypt(encrypted, this.key);
return this.decoder.decode(plaintext);
} }
module.exports = SecureMessageService;
Use this endpoint to create a JWT for the specified customer based on their unique subject identifier included in the previous section.
If a customer with the given sub
has not yet been created in Data Access, using this endpoint will create it.
Endpoint:
POST /admin/customers/jwt
1
2
3
curl -X POST https://access.your-domain.com/admin/customers/jwt \
-H 'Content-Type: application/json' \
-H 'token: {admin_jwt}'
1
{end user jwt}
Data Access has a specific route to be used when embedding the customer consent-management widget in an iframe. Passing in the jwt
query parameter into the iframe route and setting the value to the customer JWT will authorize the view for the specified customer without needing to re-authenticate.
Endpoint:
GET /embed/authorizations?jwt=${customer_jwt}