set resource session cookie in proxy via param

This commit is contained in:
Milo Schwartz
2024-11-23 23:31:22 -05:00
parent 34c9093469
commit d7c4bc43a4
12 changed files with 143 additions and 81 deletions

View File

@@ -2,10 +2,11 @@ import { cookies } from "next/headers";
export async function authCookieHeader() {
const allCookies = await cookies();
const sessionId = allCookies.get("session")?.value ?? null;
const cookieName = process.env.SESSION_COOKIE_NAME!;
const sessionId = allCookies.get(cookieName)?.value ?? null;
return {
headers: {
Cookie: `session=${sessionId}`
}
}
Cookie: `${cookieName}=${sessionId}`,
},
};
}

View File

@@ -37,6 +37,7 @@ import { AxiosResponse } from "axios";
import { LoginResponse } from "@server/routers/auth";
import ResourceAccessDenied from "./ResourceAccessDenied";
import LoginForm from "@app/components/LoginForm";
import { AuthWithPasswordResponse } from "@server/routers/resource";
const pinSchema = z.object({
pin: z
@@ -62,6 +63,7 @@ type ResourceAuthPortalProps = {
id: number;
};
redirect: string;
queryParamName: string;
};
export default function ResourceAuthPortal(props: ResourceAuthPortalProps) {
@@ -112,13 +114,29 @@ export default function ResourceAuthPortal(props: ResourceAuthPortalProps) {
},
});
function constructRedirect(redirect: string, token: string): string {
const redirectUrl = new URL(redirect);
redirectUrl.searchParams.delete(props.queryParamName);
redirectUrl.searchParams.append(props.queryParamName, token);
return redirectUrl.toString();
}
const onPinSubmit = (values: z.infer<typeof pinSchema>) => {
setLoadingLogin(true);
api.post(`/resource/${props.resource.id}/auth/pincode`, {
pincode: values.pin,
})
api.post<AxiosResponse<AuthWithPasswordResponse>>(
`/resource/${props.resource.id}/auth/pincode`,
{
pincode: values.pin,
},
)
.then((res) => {
window.location.href = props.redirect;
const session = res.data.data.session;
if (session) {
window.location.href = constructRedirect(
props.redirect,
session,
);
}
})
.catch((e) => {
console.error(e);
@@ -131,11 +149,20 @@ export default function ResourceAuthPortal(props: ResourceAuthPortalProps) {
const onPasswordSubmit = (values: z.infer<typeof passwordSchema>) => {
setLoadingLogin(true);
api.post(`/resource/${props.resource.id}/auth/password`, {
password: values.password,
})
api.post<AxiosResponse<AuthWithPasswordResponse>>(
`/resource/${props.resource.id}/auth/password`,
{
password: values.password,
},
)
.then((res) => {
window.location.href = props.redirect;
const session = res.data.data.session;
if (session) {
window.location.href = constructRedirect(
props.redirect,
session,
);
}
})
.catch((e) => {
console.error(e);

View File

@@ -14,7 +14,7 @@ import ResourceAccessDenied from "./components/ResourceAccessDenied";
export default async function ResourceAuthPage(props: {
params: Promise<{ resourceId: number }>;
searchParams: Promise<{ r: string }>;
searchParams: Promise<{ redirect: string }>;
}) {
const params = await props.params;
const searchParams = await props.searchParams;
@@ -44,9 +44,10 @@ export default async function ResourceAuthPage(props: {
const hasAuth = authInfo.password || authInfo.pincode || authInfo.sso;
const isSSOOnly = authInfo.sso && !authInfo.password && !authInfo.pincode;
const redirectUrl = searchParams.r || authInfo.url;
const redirectUrl = searchParams.redirect || authInfo.url;
if (!hasAuth) {
// no authentication so always go straight to the resource
redirect(redirectUrl);
}
@@ -93,6 +94,9 @@ export default async function ResourceAuthPage(props: {
id: authInfo.resourceId,
}}
redirect={redirectUrl}
queryParamName={
process.env.RESOURCE_SESSION_QUERY_PARAM_NAME!
}
/>
</div>
</>