3.10.3 • Published 2 years ago

@strata-foundation/web3-token-auth v3.10.3

Weekly downloads
-
License
-
Repository
github
Last release
2 years ago

Web3 Token Auth middleware

A simple fetch middleware for Solana web3.js that can auth using Bearer tokens.

Usage

import { Connection } from "@solana/web3.js";
import { tokenAuthFetchMiddleware } from "@strata-foundation/web3-token-auth";

async function getToken(): Promise<string> {
  // Logic to get an auth token
}

const connection = new Connection("...", { 
  fetchMiddleware: tokenAuthFetchMiddleware({
    getToken
  })
})

GenesysGo

The main use case for this was GenesysGo adding auth to the RPC. Here's how to set that up:

Client Code

If you're using client code (eg React), you'll want to set up a server side endpoint that uses your gengo credentials to get the access token. This way, nobody can abuse your credentials.

If you're using nextjs, you can set an endpoint up at "/api/get-token":

ISSUER=https://auth.genesysgo.net/auth/realms/RPCs/protocol/openid-connect
CLIENT_ID=
CLIENT_SECRET=
import { Base64 } from "js-base64";
import type { NextApiRequest, NextApiResponse } from "next";
import axios from "axios";

type Data = {
  access_token: string;
};

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse<Data>
) {
  const token = Base64.encode(
    `${process.env.CLIENT_ID}:${process.env.CLIENT_SECRET}`
  );
  try {
    const { token_type, access_token } = (
      await axios.post(
        `${process.env.ISSUER}/token`,
        "grant_type=client_credentials",
        {
          headers: {
            "Content-Type": "application/x-www-form-urlencoded",
            Authorization: `Basic ${token}`,
          },
        }
      )
    ).data;
    res.status(200).json({ access_token });
  } catch (e) {
    console.log(e);
    res.status(500);
  }
}

Then, on the client side, you can do something like this:

export const getToken = async (url: string) => {
  const req = await fetch("/api/get-token");
  const { access_token }: { access_token: string } = await req.json();
  return access_token;
};

...

    <ConnectionProvider
      endpoint={cluster || endpoint}
      config={{
        fetchMiddleware: tokenAuthFetchMiddleware({
          getToken,
        }),
        commitment: "confirmed"
      }}
    >
     ...
    </ConnectionProvider>
...

NodeJS Code

import { Connection } from "@solana/web3.js";
import { tokenAuthFetchMiddleware } from "@strata-foundation/web3-token-auth";
import request from "request-promise";
import { Base64 } from "js-base64";

async function getToken(): Promise<string> {
  const token = Base64.encode(
    `${process.env.CLIENT_ID}:${process.env.CLIENT_SECRET}`
  );
  const { access_token } = await request({
    uri: `${process.env.ISSUER}/token`,
    json: true,
    method: "POST",
    headers: {
      authorization: `Basic ${token}`,
    },
    form: {
      grant_type: "client_credentials",
    },
  });

  return access_token;
}

const connection = new Connection("...", { 
  fetchMiddleware: tokenAuthFetchMiddleware({
    getToken
  })
})