Skip to content

An AsgardeoStrategy for Remix Auth, based on the OAuth2Strategy

License

Notifications You must be signed in to change notification settings

asgardeo/remix-auth-asgardeo

Repository files navigation

Remix Auth Asgardeo

🚀 Release 🧱 Builder

Stackoverflow Discord License Twitter


Remix Auth is a flexible authentication framework for Remix applications that allows developers to implement various strategies for user authentication.

The Asgardeo strategy is a custom implementation of the OAuth2Strategy designed specifically for integrating with Asgardeo, an identity-as-a-service (IDaaS) platform. This strategy enables developers to authenticate users against an Asgardeo organization using OpenID Connect (OIDC).

Supported runtimes

Runtime Has Support
Node.js
Cloudflare

How to use

Create an Asgardeo organization

Head over to Asgardeo and sign up for an organization.

Register an application

Follow the steps on the Asgardeo documentation to create an application and get the client ID, and client secret.

Create the Asgardeo strategy instance

// app/utils/asgardeo.server.ts
import { Authenticator } from "remix-auth";
import { AsgardeoStrategy } from "remix-auth-asgardeo";

// Create an instance of the authenticator, pass a generic with what your
// strategies will return and will be stored in the session
export const authenticator = new Authenticator<User>(sessionStorage);

let asgardeoStrategy = new AsgardeoStrategy(
  {
    authorizedRedirectUrl: "http://localhost:5173/auth/asgardeo/callback",
    clientID: "YOUR_ASGARDEO_CLIENT_ID",
    clientSecret: "YOUR_ASGARDEO_CLIENT_SECRET",
    baseUrl: "https://api.asgardeo.io/t/<YOUR_ASGARDEO_ORG_NAME>",
  },
  async ({ accessToken, refreshToken, extraParams, profile }) => {
    // Get the user data from your DB or API using the tokens and profile
    return User.findOrCreate({ email: profile.emails[0].value });
  }
);

authenticator.use(asgardeoStrategy);

Setup application routes

// app/routes/login.tsx
export default function Login() {
  return (
    <Form action="/auth/asgardeo" method="post">
      <button>Login with Asgardeo</button>
    </Form>
  );
}
// app/routes/auth.asgardeo.tsx
import type { ActionFunctionArgs } from "@remix-run/node";

import { authenticator } from "~/utils/asgardeo.server";

export let loader = () => redirect("/login");

export let action = ({ request }: ActionFunctionArgs) => {
  return authenticator.authenticate("asgardeo", request);
};
// app/routes/auth.asgardeo.callback.tsx
import type { LoaderFunctionArgs } from "@remix-run/node";

import { authenticator } from "~/utils/asgardeo.server";

export let loader = ({ request }: LoaderFunctionArgs) => {
  return authenticator.authenticate("asgardeo", request, {
    successRedirect: "/dashboard",
    failureRedirect: "/login",
  });
};
// app/routes/auth.logout.ts
import type { ActionFunctionArgs } from "@remix-run/node";

import { redirect } from "@remix-run/node";

import { destroySession, getSession } from "~/utils/asgardeo.server";

export const action = async ({ request }: ActionFunctionArgs) => {
  const session = await getSession(request.headers.get("Cookie"));
  const logoutURL = new URL(process.env.ASGARDEO_LOGOUT_URL); // i.e https://api.asgardeo.io/t/pavinduorg/oidc/logout

  logoutURL.searchParams.set("client_id", process.env.ASGARDEO_CLIENT_ID);
  logoutURL.searchParams.set("returnTo", process.env.ASGARDEO_RETURN_TO_URL);

  return redirect(logoutURL.toString(), {
    headers: {
      "Set-Cookie": await destroySession(session),
    },
  });
};

Contribute

Please read Contributing Guide for details on how to contribute to Remix Auth Asgardeo. Refer to General Contribution Guidelines for details on our code of conduct, and the process for submitting pull requests to us.

Reporting issues

We encourage you to report issues, improvements, and feature requests creating Github Issues.

Important: Please be advised that security issues MUST be reported to security@wso2com, not as GitHub issues, in order to reach the proper audience. We strongly advise following the WSO2 Security Vulnerability Reporting Guidelines when reporting the security issues.

License

This project is licensed under the Apache License 2.0. See the LICENSE file for details.