OktaStrategy
The Okta strategy is used to authenticate users against an okta account. It extends the OAuth2Strategy.
Supported runtimes
Runtime | Has Support |
---|
Node.js | ✅ |
Cloudflare | ✅ |
Prerequisites
Create an Okta Web app
Follow the steps on the Okta documentation to create Okta web app and get client ID, client secret and issuer
How to use
Create the strategy instance
import { Authenticator } from "remix-auth";
import { OktaStrategy } from "remix-auth-okta";
export const authenticator = new Authenticator<User>(sessionStorage);
let oktaStrategy = new OktaStrategy(
{
issuer: "YOUR_OKTA_ISSUER",
clientID: "YOUR_OKTA_CLIENT_ID",
clientSecret: "YOUR_OKTA_CLIENT_SECRET",
callbackURL: "https://your-app-domain.com/auth/okta/callback",
},
async ({ accessToken, refreshToken, extraParams, profile }) => {
return User.findOrCreate({ email: profile.email });
}
);
authenticator.use(oktaStrategy);
Setup your routes
export default function Login() {
return (
<Form action="/auth/okta" method="post">
<button>Login with Okta</button>
</Form>
);
}
import type { ActionFunction, LoaderFunction } from "remix";
import { authenticator } from "~/utils/auth.server";
export let loader: LoaderFunction = () => redirect("/login");
export let action: ActionFunction = ({ request }) => {
return authenticator.authenticate("okta", request);
};
import type { ActionFunction, LoaderFunction } from "remix";
import { authenticator } from "~/utils/auth.server";
export let loader: LoaderFunction = ({ request }) => {
return authenticator.authenticate("okta", request, {
successRedirect: "/private",
failureRedirect: "/login",
});
};
How to use with custom login page
Create the strategy instance
import { Authenticator } from "remix-auth";
import { OktaStrategy } from "remix-auth-okta";
export const authenticator = new Authenticator<User>(sessionStorage);
let oktaStrategy = new OktaStrategy(
{
issuer: "YOUR_OKTA_ISSUER",
clientID: "YOUR_OKTA_CLIENT_ID",
clientSecret: "YOUR_OKTA_CLIENT_SECRET",
callbackURL: "https://your-app-domain.com/auth/okta/callback",
withCustomLoginForm: true,
oktaDomain: "YOUR_OKTA_DOMAIN"
},
async ({ accessToken, refreshToken, extraParams, profile }) => {
return User.findOrCreate({ email: profile.email });
}
);
authenticator.use(oktaStrategy);
Setup your routes
export default function Login() {
return (
<Form action="/auth/okta" method="post">
<input type="text" name="email"/>
<input type="password" name="password"/>
<button>Log in</button>
</Form>
);
}
import type { ActionFunction, LoaderFunction } from "remix";
import { authenticator } from "~/utils/auth.server";
export let loader: LoaderFunction = () => redirect("/login");
export let action: ActionFunction = ({ request }) => {
return authenticator.authenticate("okta", request);
};
import type { ActionFunction, LoaderFunction } from "remix";
import { authenticator } from "~/utils/auth.server";
export let loader: LoaderFunction = ({ request }) => {
return authenticator.authenticate("okta", request, {
successRedirect: "/private",
failureRedirect: "/login",
});
};