Continue a grant request
During a grant request flow, an authorization server can require an individual (typically a client’s end user) to approve the grant by interacting directly with the server. For example, by tapping an Approve button on a web page provided by the auth server.
After the individual approves the grant, the auth server sends the client an interaction reference. The client must send a continuation request containing the reference back to the authorization server to obtain an access token.
These code snippets enable an authorized client to send a grant continuation request to the authorization server.
Before you begin
Section titled “Before you begin”We recommend creating a wallet account on the test wallet. Creating an account allows you to test your client against the Open Payments APIs by using an ILP-enabled wallet funded with play money.
Issue grant continuation request
Section titled “Issue grant continuation request”Initial configuration
If you’re using JavaScript, only do the first step.
- Add
"type": "module"topackage.json. - Add the following to
tsconfig.json{"compilerOptions": {"target": "ES2022","module": "ES2022"}}
Import dependencies
import { createAuthenticatedClient } from "@interledger/open-payments"; Copied! Initialize Open Payments client
const client = await createAuthenticatedClient({
walletAddressUrl: WALLET_ADDRESS,
privateKey: PRIVATE_KEY_PATH,
keyId: KEY_ID,
}); Copied! Continue grant
const grant = await client.grant.continue(
{
accessToken: CONTINUE_ACCESS_TOKEN,
url: CONTINUE_URI,
},
{
interact_ref: interactRef,
},
); Copied! Check grant state
if (!isFinalizedGrant(grant)) {
throw new Error("Expected finalized grant. Received non-finalized grant.");
} Copied! Output
console.log("OUTGOING_PAYMENT_ACCESS_TOKEN =", grant.access_token.value);
console.log(
"OUTGOING_PAYMENT_ACCESS_TOKEN_MANAGE_URL =",
grant.access_token.manage,
); Copied! For TypeScript, run tsx path/to/directory/index.ts. View full TS source
For JavaScript, run node path/to/directory/index.js. View full JS source
Import dependencies
use open_payments::client::AuthenticatedResources;
use open_payments::snippets::utils::{create_authenticated_client, get_env_var, load_env};
use open_payments::types::auth::ContinueResponse; Copied! Initialize Open Payments client
let client = create_authenticated_client()?; Copied! Continue grant
let access_token = get_env_var("CONTINUE_ACCESS_TOKEN")?;
let continue_uri = get_env_var("CONTINUE_URI")?;
let interact_ref = get_env_var("INTERACT_REF")?;
let response = client
.grant()
.continue_grant(&continue_uri, &interact_ref, Some(&access_token))
.await?; Copied! Output
match response {
ContinueResponse::WithToken { access_token, .. } => {
println!("Received access token: {:#?}", access_token.value);
println!(
"Received access token manage URL: {:#?}",
access_token.manage
);
}
ContinueResponse::Pending { .. } => {
println!("Pending");
}
} Copied! Import dependencies
use OpenPayments\AuthClient;
use OpenPayments\Config\Config; Copied! Initialize Open Payments client
$config = new Config($WALLET_ADDRESS, $PRIVATE_KEY, $KEY_ID);
$opClient = new AuthClient($config); Copied! Continue grant
$grant = $opClient->grant()->continue(
[
"access_token" => $CONTINUE_ACCESS_TOKEN,
"url" => $CONTINUE_URI,
],
[
"interact_ref" => $interactRef,
],
); Copied! Check grant state
if (!$grant instanceof \OpenPayments\Models\Grant) {
throw new \Error("Expected finalized grant. Received non-finalized grant.");
} Copied! Output
$output->writeln(
"OUTGOING_PAYMENT_GRANT_ACCES_TOKEN: " . $grant->access_token->value,
);
$output->writeln(
"OUTGOING_PAYMENT_ACCESS_TOKEN_MANAGE_URL: " . $grant->access_token->manage,
); Copied!