@propelauth/nextjs 0.0.111 → 0.0.112-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.d.ts +40 -2
- package/dist/client/index.js +122 -15
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +122 -15
- package/dist/client/index.mjs.map +1 -1
- package/dist/server/app-router/index.d.ts +34 -2
- package/dist/server/app-router/index.js +201 -35
- package/dist/server/app-router/index.js.map +1 -1
- package/dist/server/app-router/index.mjs +201 -35
- package/dist/server/app-router/index.mjs.map +1 -1
- package/dist/server/index.d.ts +32 -1
- package/dist/server/index.js +36 -15
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +36 -15
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/pages/index.d.ts +32 -1
- package/dist/server/pages/index.js +51 -23
- package/dist/server/pages/index.js.map +1 -1
- package/dist/server/pages/index.mjs +51 -23
- package/dist/server/pages/index.mjs.map +1 -1
- package/package.json +1 -1
| @@ -1 +1 @@ | |
| 1 | 
            -
            {"version":3,"sources":["../../src/user.ts","../../src/server/exceptions.ts","../../src/server/shared.ts","../../src/server/api.ts"],"sourcesContent":["export class UserFromToken {\n    public userId: string\n    public orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo\n\n    // Metadata about the user\n    public email: string\n    public firstName?: string\n    public lastName?: string\n    public username?: string\n    public properties?: { [key: string]: unknown }\n\n    // If you used our migration APIs to migrate this user from a different system,\n    //   this is their original ID from that system.\n    public legacyUserId?: string\n    public impersonatorUserId?: string\n\n    constructor(\n        userId: string,\n        email: string,\n        orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo,\n        firstName?: string,\n        lastName?: string,\n        username?: string,\n        legacyUserId?: string,\n        impersonatorUserId?: string,\n        properties?: { [key: string]: unknown },\n    ) {\n        this.userId = userId\n        this.orgIdToOrgMemberInfo = orgIdToOrgMemberInfo\n\n        this.email = email\n        this.firstName = firstName\n        this.lastName = lastName\n        this.username = username\n\n        this.legacyUserId = legacyUserId\n        this.impersonatorUserId = impersonatorUserId\n\n        this.properties = properties\n    }\n\n    public getOrg(orgId: string): OrgMemberInfo | undefined {\n        if (!this.orgIdToOrgMemberInfo) {\n            return undefined\n        }\n\n        return this.orgIdToOrgMemberInfo[orgId]\n    }\n\n    public getOrgByName(orgName: string): OrgMemberInfo | undefined {\n        if (!this.orgIdToOrgMemberInfo) {\n            return undefined\n        }\n\n        const urlSafeOrgName = orgName.toLowerCase().replace(/ /g, \"-\")\n        for (const orgId in this.orgIdToOrgMemberInfo) {\n            const orgMemberInfo = this.orgIdToOrgMemberInfo[orgId]\n            if (orgMemberInfo.urlSafeOrgName === urlSafeOrgName) {\n                return orgMemberInfo\n            }\n        }\n\n        return undefined\n    }\n\n    public getOrgs(): OrgMemberInfo[] {\n        if (!this.orgIdToOrgMemberInfo) {\n            return []\n        }\n\n        return Object.values(this.orgIdToOrgMemberInfo)\n    }\n\n    public isImpersonating(): boolean {\n        return !!this.impersonatorUserId\n    }\n\n    public static fromJSON(json: string): UserFromToken {\n        const obj = JSON.parse(json)\n        const orgIdToOrgMemberInfo: OrgIdToOrgMemberInfo = {}\n        for (const orgId in obj.orgIdToOrgMemberInfo) {\n            orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(\n                JSON.stringify(obj.orgIdToOrgMemberInfo[orgId])\n            )\n        }\n        return new UserFromToken(\n            obj.userId,\n            obj.email,\n            orgIdToOrgMemberInfo,\n            obj.firstName,\n            obj.lastName,\n            obj.username,\n            obj.legacyUserId,\n            obj.impersonatorUserId,\n            obj.properties,\n        )\n    }\n}\n\nexport type OrgIdToOrgMemberInfo = {\n    [orgId: string]: OrgMemberInfo\n}\n\nexport class OrgMemberInfo {\n    public orgId: string\n    public orgName: string\n    public orgMetadata: { [key: string]: any }\n    public urlSafeOrgName: string\n\n    public userAssignedRole: string\n    public userInheritedRolesPlusCurrentRole: string[]\n    public userPermissions: string[]\n\n    constructor(\n        orgId: string,\n        orgName: string,\n        orgMetadata: { [key: string]: any },\n        urlSafeOrgName: string,\n        userAssignedRole: string,\n        userInheritedRolesPlusCurrentRole: string[],\n        userPermissions: string[]\n    ) {\n        this.orgId = orgId\n        this.orgName = orgName\n        this.orgMetadata = orgMetadata\n        this.urlSafeOrgName = urlSafeOrgName\n\n        this.userAssignedRole = userAssignedRole\n        this.userInheritedRolesPlusCurrentRole = userInheritedRolesPlusCurrentRole\n        this.userPermissions = userPermissions\n    }\n\n    // validation methods\n\n    public isRole(role: string): boolean {\n        return this.userAssignedRole === role\n    }\n\n    public isAtLeastRole(role: string): boolean {\n        return this.userInheritedRolesPlusCurrentRole.includes(role)\n    }\n\n    public hasPermission(permission: string): boolean {\n        return this.userPermissions.includes(permission)\n    }\n\n    public hasAllPermissions(permissions: string[]): boolean {\n        return permissions.every((permission) => this.hasPermission(permission))\n    }\n\n    public static fromJSON(json: string): OrgMemberInfo {\n        const obj = JSON.parse(json)\n        return new OrgMemberInfo(\n            obj.orgId,\n            obj.orgName,\n            obj.orgMetadata,\n            obj.urlSafeOrgName,\n            obj.userAssignedRole,\n            obj.userInheritedRolesPlusCurrentRole,\n            obj.userPermissions\n        )\n    }\n\n    // getters for the private fields\n\n    get assignedRole(): string {\n        return this.userAssignedRole\n    }\n\n    get inheritedRolesPlusCurrentRole(): string[] {\n        return this.userInheritedRolesPlusCurrentRole\n    }\n\n    get permissions(): string[] {\n        return this.userPermissions\n    }\n}\n\n// These Internal types exist since the server returns snake case, but typescript/javascript\n// convention is camelCase.\nexport type InternalOrgMemberInfo = {\n    org_id: string\n    org_name: string\n    org_metadata: { [key: string]: any }\n    url_safe_org_name: string\n    user_role: string\n    inherited_user_roles_plus_current_role: string[]\n    user_permissions: string[]\n}\nexport type InternalUser = {\n    user_id: string\n    org_id_to_org_member_info?: { [org_id: string]: InternalOrgMemberInfo }\n\n    email: string\n    first_name?: string\n    last_name?: string\n    username?: string\n    properties?: { [key: string]: unknown }\n\n    // If you used our migration APIs to migrate this user from a different system, this is their original ID from that system.\n    legacy_user_id?: string\n    impersonatorUserId?: string\n}\n\nexport function toUser(snake_case: InternalUser): UserFromToken {\n    return new UserFromToken(\n        snake_case.user_id,\n        snake_case.email,\n        toOrgIdToOrgMemberInfo(snake_case.org_id_to_org_member_info),\n        snake_case.first_name,\n        snake_case.last_name,\n        snake_case.username,\n        snake_case.legacy_user_id,\n        snake_case.impersonatorUserId,\n        snake_case.properties,\n    )\n}\n\nexport function toOrgIdToOrgMemberInfo(snake_case?: {\n    [org_id: string]: InternalOrgMemberInfo\n}): OrgIdToOrgMemberInfo | undefined {\n    if (snake_case === undefined) {\n        return undefined\n    }\n    const camelCase: OrgIdToOrgMemberInfo = {}\n\n    for (const key of Object.keys(snake_case)) {\n        const snakeCaseValue = snake_case[key]\n        if (snakeCaseValue) {\n            camelCase[key] = new OrgMemberInfo(\n                snakeCaseValue.org_id,\n                snakeCaseValue.org_name,\n                snakeCaseValue.org_metadata,\n                snakeCaseValue.url_safe_org_name,\n                snakeCaseValue.user_role,\n                snakeCaseValue.inherited_user_roles_plus_current_role,\n                snakeCaseValue.user_permissions\n            )\n        }\n    }\n\n    return camelCase\n}\n","export class UnauthorizedException extends Error {\n    readonly message: string\n    readonly status: number\n\n    constructor(message: string) {\n        super(message)\n        this.message = message\n        this.status = 401\n    }\n}\n\nexport class ConfigurationException extends Error {\n    readonly message: string\n    readonly status: number\n\n    constructor(message: string) {\n        super(message)\n        this.message = message\n        this.status = 500\n    }\n}\n","import {ResponseCookie} from \"next/dist/compiled/@edge-runtime/cookies\";\nimport {InternalUser, toUser, UserFromToken} from \"../user\";\nimport {ConfigurationException, UnauthorizedException} from \"./exceptions\";\nimport * as jose from \"jose\";\n\ntype RefreshAndAccessTokens = {\n    refreshToken: string\n    accessToken: string\n    error: \"none\"\n}\n\ntype RefreshAndAccessTokensUnauthorizedError = {\n    error: \"unauthorized\"\n}\n\ntype RefreshAndAccessTokensUnexpectedError = {\n    error: \"unexpected\"\n}\n\nexport type RefreshTokenResponse =\n    RefreshAndAccessTokens\n    | RefreshAndAccessTokensUnauthorizedError\n    | RefreshAndAccessTokensUnexpectedError\n\nexport const LOGIN_PATH = \"/api/auth/login\"\nexport const CALLBACK_PATH = \"/api/auth/callback\"\nexport const USERINFO_PATH = \"/api/auth/userinfo\"\nexport const LOGOUT_PATH = \"/api/auth/logout\"\nexport const ACCESS_TOKEN_COOKIE_NAME = \"__pa_at\"\nexport const REFRESH_TOKEN_COOKIE_NAME = \"__pa_rt\"\nexport const STATE_COOKIE_NAME = \"__pa_state\"\nexport const CUSTOM_HEADER_FOR_ACCESS_TOKEN = \"x-propelauth-access-token\"\nexport const RETURN_TO_PATH_COOKIE_NAME = \"__pa_return_to_path\"\n\nexport const COOKIE_OPTIONS: Partial<ResponseCookie> = {\n    httpOnly: true,\n    sameSite: \"lax\",\n    secure: true,\n    path: \"/\",\n}\n\nexport function getAuthUrlOrigin() {\n    return getAuthUrl().origin\n}\n\nexport function getAuthUrl() {\n    const authUrl = process.env.NEXT_PUBLIC_AUTH_URL\n    if (!authUrl) {\n        throw new Error(\"NEXT_PUBLIC_AUTH_URL is not set\")\n    }\n    return new URL(authUrl)\n}\n\nexport function getRedirectUri() {\n    const redirectUri = process.env.PROPELAUTH_REDIRECT_URI\n    if (!redirectUri) {\n        throw new Error(\"PROPELAUTH_REDIRECT_URI is not set\")\n    }\n    return redirectUri\n}\n\nexport function getIntegrationApiKey() {\n    const integrationApiKey = process.env.PROPELAUTH_API_KEY\n    if (!integrationApiKey) {\n        throw new Error(\"PROPELAUTH_API_KEY is not set\")\n    }\n    return integrationApiKey\n}\n\nexport function getVerifierKey() {\n    const verifierKey = process.env.PROPELAUTH_VERIFIER_KEY\n    if (!verifierKey) {\n        throw new Error(\"PROPELAUTH_VERIFIER_KEY is not set\")\n    }\n    return verifierKey.replace(/\\\\n/g, \"\\n\")\n}\n\nexport async function refreshTokenWithAccessAndRefreshToken(refreshToken: string): Promise<RefreshTokenResponse> {\n    const body = {\n        refresh_token: refreshToken,\n    }\n    const url = `${getAuthUrlOrigin()}/api/backend/v1/refresh_token`\n    const response = await fetch(url, {\n        method: \"POST\",\n        body: JSON.stringify(body),\n        headers: {\n            \"Content-Type\": \"application/json\",\n            Authorization: \"Bearer \" + getIntegrationApiKey(),\n        },\n    })\n\n    if (response.ok) {\n        const data = await response.json()\n        const newRefreshToken = data.refresh_token\n        const {\n            access_token: accessToken,\n            expires_at_seconds: expiresAtSeconds,\n        } = data.access_token\n\n        return {\n            refreshToken: newRefreshToken,\n            accessToken,\n            error: \"none\",\n        }\n    } else if (response.status === 400 || response.status === 401) {\n        return {error: \"unauthorized\"}\n    } else {\n        return {error: \"unexpected\"}\n    }\n}\n\nexport async function validateAccessTokenOrUndefined(accessToken: string | undefined): Promise<UserFromToken | undefined> {\n    try {\n        return await validateAccessToken(accessToken)\n    } catch (err) {\n        if (err instanceof ConfigurationException) {\n            throw err\n        } else if (err instanceof UnauthorizedException) {\n            return undefined\n        } else {\n            console.info(\"Error validating access token\", err)\n            return undefined\n        }\n    }\n}\n\nexport async function validateAccessToken(accessToken: string | undefined): Promise<UserFromToken> {\n    let publicKey\n    try {\n        publicKey = await jose.importSPKI(getVerifierKey(), \"RS256\")\n    } catch (err) {\n        console.error(\"Verifier key is invalid. Make sure it's specified correctly, including the newlines.\", err)\n        throw new ConfigurationException(\"Invalid verifier key\")\n    }\n\n    if (!accessToken) {\n        throw new UnauthorizedException(\"No access token provided\")\n    }\n\n    let accessTokenWithoutBearer = accessToken\n    if (accessToken.toLowerCase().startsWith(\"bearer \")) {\n        accessTokenWithoutBearer = accessToken.substring(\"bearer \".length)\n    }\n\n    try {\n        const {payload} = await jose.jwtVerify(accessTokenWithoutBearer, publicKey, {\n            issuer: getAuthUrlOrigin(),\n            algorithms: [\"RS256\"],\n        })\n\n        return toUser(<InternalUser>payload)\n    } catch (e) {\n        if (e instanceof Error) {\n            throw new UnauthorizedException(e.message)\n        } else {\n            throw new UnauthorizedException(\"Unable to decode jwt\")\n        }\n    }\n}\n","import {getApis} from \"@propelauth/node-apis\";\nimport {getAuthUrl, getIntegrationApiKey} from \"./shared\";\n\nexport const getPropelAuthApis = () => {\n    const authUrl = getAuthUrl()\n    const integrationApiKey = getIntegrationApiKey()\n\n    return getApis(authUrl, integrationApiKey)\n}"],"mappings":"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","names":[]}
         | 
| 1 | 
            +
            {"version":3,"sources":["../../src/user.ts","../../src/server/exceptions.ts","../../src/server/shared.ts","../../src/server/api.ts"],"sourcesContent":["export class UserFromToken {\n    public userId: string\n\n    public activeOrgId?: string\n    public orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo\n\n    // Metadata about the user\n    public email: string\n    public firstName?: string\n    public lastName?: string\n    public username?: string\n    public properties?: { [key: string]: unknown }\n\n    // If you used our migration APIs to migrate this user from a different system,\n    //   this is their original ID from that system.\n    public legacyUserId?: string\n    public impersonatorUserId?: string\n\n    constructor(\n        userId: string,\n        email: string,\n        orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo,\n        firstName?: string,\n        lastName?: string,\n        username?: string,\n        legacyUserId?: string,\n        impersonatorUserId?: string,\n        properties?: { [key: string]: unknown },\n        activeOrgId?: string\n    ) {\n        this.userId = userId\n\n        this.activeOrgId = activeOrgId\n        this.orgIdToOrgMemberInfo = orgIdToOrgMemberInfo\n\n        this.email = email\n        this.firstName = firstName\n        this.lastName = lastName\n        this.username = username\n\n        this.legacyUserId = legacyUserId\n        this.impersonatorUserId = impersonatorUserId\n\n        this.properties = properties\n    }\n\n    public getActiveOrg(): OrgMemberInfo | undefined {\n        if (!this.activeOrgId || !this.orgIdToOrgMemberInfo) {\n            return undefined\n        }\n\n        return this.orgIdToOrgMemberInfo[this.activeOrgId]\n    }\n\n    public getActiveOrgId(): string | undefined {\n        return this.activeOrgId\n    }\n\n    public getOrg(orgId: string): OrgMemberInfo | undefined {\n        if (!this.orgIdToOrgMemberInfo) {\n            return undefined\n        }\n\n        return this.orgIdToOrgMemberInfo[orgId]\n    }\n\n    public getOrgByName(orgName: string): OrgMemberInfo | undefined {\n        if (!this.orgIdToOrgMemberInfo) {\n            return undefined\n        }\n\n        const urlSafeOrgName = orgName.toLowerCase().replace(/ /g, '-')\n        for (const orgId in this.orgIdToOrgMemberInfo) {\n            const orgMemberInfo = this.orgIdToOrgMemberInfo[orgId]\n            if (orgMemberInfo.urlSafeOrgName === urlSafeOrgName) {\n                return orgMemberInfo\n            }\n        }\n\n        return undefined\n    }\n\n    public getOrgs(): OrgMemberInfo[] {\n        if (!this.orgIdToOrgMemberInfo) {\n            return []\n        }\n\n        return Object.values(this.orgIdToOrgMemberInfo)\n    }\n\n    public isImpersonating(): boolean {\n        return !!this.impersonatorUserId\n    }\n\n    public static fromJSON(json: string): UserFromToken {\n        const obj = JSON.parse(json)\n        const orgIdToOrgMemberInfo: OrgIdToOrgMemberInfo = {}\n        for (const orgId in obj.orgIdToOrgMemberInfo) {\n            orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(JSON.stringify(obj.orgIdToOrgMemberInfo[orgId]))\n        }\n        return new UserFromToken(\n            obj.userId,\n            obj.email,\n            orgIdToOrgMemberInfo,\n            obj.firstName,\n            obj.lastName,\n            obj.username,\n            obj.legacyUserId,\n            obj.impersonatorUserId,\n            obj.properties\n        )\n    }\n\n    public static fromJwtPayload(payload: InternalUser): UserFromToken {\n        let activeOrgId: string | undefined\n        let orgIdToOrgMemberInfo: OrgIdToOrgMemberInfo | undefined\n\n        if (payload.org_member_info) {\n            activeOrgId = payload.org_member_info.org_id\n            orgIdToOrgMemberInfo = toOrgIdToOrgMemberInfo({ [activeOrgId]: payload.org_member_info })\n        } else {\n            activeOrgId = undefined\n            orgIdToOrgMemberInfo = toOrgIdToOrgMemberInfo(payload.org_id_to_org_member_info)\n        }\n\n        return new UserFromToken(\n            payload.user_id,\n            payload.email,\n            orgIdToOrgMemberInfo,\n            payload.first_name,\n            payload.last_name,\n            payload.username,\n            payload.legacy_user_id,\n            payload.impersonatorUserId,\n            payload.properties,\n            activeOrgId\n        )\n    }\n}\n\nexport type OrgIdToOrgMemberInfo = {\n    [orgId: string]: OrgMemberInfo\n}\n\nexport class OrgMemberInfo {\n    public orgId: string\n    public orgName: string\n    public orgMetadata: { [key: string]: any }\n    public urlSafeOrgName: string\n\n    public userAssignedRole: string\n    public userInheritedRolesPlusCurrentRole: string[]\n    public userPermissions: string[]\n\n    constructor(\n        orgId: string,\n        orgName: string,\n        orgMetadata: { [key: string]: any },\n        urlSafeOrgName: string,\n        userAssignedRole: string,\n        userInheritedRolesPlusCurrentRole: string[],\n        userPermissions: string[]\n    ) {\n        this.orgId = orgId\n        this.orgName = orgName\n        this.orgMetadata = orgMetadata\n        this.urlSafeOrgName = urlSafeOrgName\n\n        this.userAssignedRole = userAssignedRole\n        this.userInheritedRolesPlusCurrentRole = userInheritedRolesPlusCurrentRole\n        this.userPermissions = userPermissions\n    }\n\n    // validation methods\n\n    public isRole(role: string): boolean {\n        return this.userAssignedRole === role\n    }\n\n    public isAtLeastRole(role: string): boolean {\n        return this.userInheritedRolesPlusCurrentRole.includes(role)\n    }\n\n    public hasPermission(permission: string): boolean {\n        return this.userPermissions.includes(permission)\n    }\n\n    public hasAllPermissions(permissions: string[]): boolean {\n        return permissions.every((permission) => this.hasPermission(permission))\n    }\n\n    public static fromJSON(json: string): OrgMemberInfo {\n        const obj = JSON.parse(json)\n        return new OrgMemberInfo(\n            obj.orgId,\n            obj.orgName,\n            obj.orgMetadata,\n            obj.urlSafeOrgName,\n            obj.userAssignedRole,\n            obj.userInheritedRolesPlusCurrentRole,\n            obj.userPermissions\n        )\n    }\n\n    // getters for the private fields\n\n    get assignedRole(): string {\n        return this.userAssignedRole\n    }\n\n    get inheritedRolesPlusCurrentRole(): string[] {\n        return this.userInheritedRolesPlusCurrentRole\n    }\n\n    get permissions(): string[] {\n        return this.userPermissions\n    }\n}\n\n// These Internal types exist since the server returns snake case, but typescript/javascript\n// convention is camelCase.\nexport type InternalOrgMemberInfo = {\n    org_id: string\n    org_name: string\n    org_metadata: { [key: string]: any }\n    url_safe_org_name: string\n    user_role: string\n    inherited_user_roles_plus_current_role: string[]\n    user_permissions: string[]\n}\nexport type InternalUser = {\n    user_id: string\n\n    org_member_info?: InternalOrgMemberInfo\n    org_id_to_org_member_info?: { [org_id: string]: InternalOrgMemberInfo }\n\n    email: string\n    first_name?: string\n    last_name?: string\n    username?: string\n    properties?: { [key: string]: unknown }\n\n    // If you used our migration APIs to migrate this user from a different system, this is their original ID from that system.\n    legacy_user_id?: string\n    impersonatorUserId?: string\n}\n\nexport function toUser(snake_case: InternalUser): UserFromToken {\n    return UserFromToken.fromJwtPayload(snake_case)\n}\n\nexport function toOrgIdToOrgMemberInfo(snake_case?: {\n    [org_id: string]: InternalOrgMemberInfo\n}): OrgIdToOrgMemberInfo | undefined {\n    if (snake_case === undefined) {\n        return undefined\n    }\n    const camelCase: OrgIdToOrgMemberInfo = {}\n\n    for (const key of Object.keys(snake_case)) {\n        const snakeCaseValue = snake_case[key]\n        if (snakeCaseValue) {\n            camelCase[key] = new OrgMemberInfo(\n                snakeCaseValue.org_id,\n                snakeCaseValue.org_name,\n                snakeCaseValue.org_metadata,\n                snakeCaseValue.url_safe_org_name,\n                snakeCaseValue.user_role,\n                snakeCaseValue.inherited_user_roles_plus_current_role,\n                snakeCaseValue.user_permissions\n            )\n        }\n    }\n\n    return camelCase\n}\n","export class UnauthorizedException extends Error {\n    readonly message: string\n    readonly status: number\n\n    constructor(message: string) {\n        super(message)\n        this.message = message\n        this.status = 401\n    }\n}\n\nexport class ConfigurationException extends Error {\n    readonly message: string\n    readonly status: number\n\n    constructor(message: string) {\n        super(message)\n        this.message = message\n        this.status = 500\n    }\n}\n","import { ResponseCookie } from 'next/dist/compiled/@edge-runtime/cookies'\nimport { InternalUser, toUser, UserFromToken } from '../user'\nimport { ConfigurationException, UnauthorizedException } from './exceptions'\nimport * as jose from 'jose'\n\ntype RefreshAndAccessTokens = {\n    refreshToken: string\n    accessToken: string\n    error: 'none'\n}\n\ntype RefreshAndAccessTokensUnauthorizedError = {\n    error: 'unauthorized'\n}\n\ntype RefreshAndAccessTokensUnexpectedError = {\n    error: 'unexpected'\n}\n\nexport type RefreshTokenResponse =\n    | RefreshAndAccessTokens\n    | RefreshAndAccessTokensUnauthorizedError\n    | RefreshAndAccessTokensUnexpectedError\n\nexport const LOGIN_PATH = '/api/auth/login'\nexport const CALLBACK_PATH = '/api/auth/callback'\nexport const USERINFO_PATH = '/api/auth/userinfo'\nexport const LOGOUT_PATH = '/api/auth/logout'\nexport const ACCESS_TOKEN_COOKIE_NAME = '__pa_at'\nexport const REFRESH_TOKEN_COOKIE_NAME = '__pa_rt'\nexport const STATE_COOKIE_NAME = '__pa_state'\nexport const CUSTOM_HEADER_FOR_ACCESS_TOKEN = 'x-propelauth-access-token'\nexport const RETURN_TO_PATH_COOKIE_NAME = '__pa_return_to_path'\n\nexport const COOKIE_OPTIONS: Partial<ResponseCookie> = {\n    httpOnly: true,\n    sameSite: 'lax',\n    secure: true,\n    path: '/',\n}\n\nexport function getAuthUrlOrigin() {\n    return getAuthUrl().origin\n}\n\nexport function getAuthUrl() {\n    const authUrl = process.env.NEXT_PUBLIC_AUTH_URL\n    if (!authUrl) {\n        throw new Error('NEXT_PUBLIC_AUTH_URL is not set')\n    }\n    return new URL(authUrl)\n}\n\nexport function getRedirectUri() {\n    const redirectUri = process.env.PROPELAUTH_REDIRECT_URI\n    if (!redirectUri) {\n        throw new Error('PROPELAUTH_REDIRECT_URI is not set')\n    }\n    return redirectUri\n}\n\nexport function getIntegrationApiKey() {\n    const integrationApiKey = process.env.PROPELAUTH_API_KEY\n    if (!integrationApiKey) {\n        throw new Error('PROPELAUTH_API_KEY is not set')\n    }\n    return integrationApiKey\n}\n\nexport function getVerifierKey() {\n    const verifierKey = process.env.PROPELAUTH_VERIFIER_KEY\n    if (!verifierKey) {\n        throw new Error('PROPELAUTH_VERIFIER_KEY is not set')\n    }\n    return verifierKey.replace(/\\\\n/g, '\\n')\n}\n\nexport async function refreshTokenWithAccessAndRefreshToken(\n    refreshToken: string,\n    activeOrgId?: string\n): Promise<RefreshTokenResponse> {\n    const body = {\n        refresh_token: refreshToken,\n    }\n\n    const queryParams = new URLSearchParams()\n    if (activeOrgId) {\n        queryParams.set('with_active_org_support', 'true')\n        queryParams.set('active_org_id', activeOrgId)\n    }\n\n    const url = `${getAuthUrlOrigin()}/api/backend/v1/refresh_token?${queryParams.toString()}`\n    const response = await fetch(url, {\n        method: 'POST',\n        body: JSON.stringify(body),\n        headers: {\n            'Content-Type': 'application/json',\n            Authorization: 'Bearer ' + getIntegrationApiKey(),\n        },\n    })\n\n    if (response.ok) {\n        const data = await response.json()\n        const newRefreshToken = data.refresh_token\n        const { access_token: accessToken, expires_at_seconds: expiresAtSeconds } = data.access_token\n\n        return {\n            refreshToken: newRefreshToken,\n            accessToken,\n            error: 'none',\n        }\n    } else if (response.status === 400 || response.status === 401) {\n        return { error: 'unauthorized' }\n    } else {\n        return { error: 'unexpected' }\n    }\n}\n\nexport async function validateAccessTokenOrUndefined(\n    accessToken: string | undefined\n): Promise<UserFromToken | undefined> {\n    try {\n        return await validateAccessToken(accessToken)\n    } catch (err) {\n        if (err instanceof ConfigurationException) {\n            throw err\n        } else if (err instanceof UnauthorizedException) {\n            return undefined\n        } else {\n            console.info('Error validating access token', err)\n            return undefined\n        }\n    }\n}\n\nexport async function validateAccessToken(accessToken: string | undefined): Promise<UserFromToken> {\n    let publicKey\n    try {\n        publicKey = await jose.importSPKI(getVerifierKey(), 'RS256')\n    } catch (err) {\n        console.error(\"Verifier key is invalid. Make sure it's specified correctly, including the newlines.\", err)\n        throw new ConfigurationException('Invalid verifier key')\n    }\n\n    if (!accessToken) {\n        throw new UnauthorizedException('No access token provided')\n    }\n\n    let accessTokenWithoutBearer = accessToken\n    if (accessToken.toLowerCase().startsWith('bearer ')) {\n        accessTokenWithoutBearer = accessToken.substring('bearer '.length)\n    }\n\n    try {\n        const { payload } = await jose.jwtVerify(accessTokenWithoutBearer, publicKey, {\n            issuer: getAuthUrlOrigin(),\n            algorithms: ['RS256'],\n        })\n\n        return toUser(<InternalUser>payload)\n    } catch (e) {\n        if (e instanceof Error) {\n            throw new UnauthorizedException(e.message)\n        } else {\n            throw new UnauthorizedException('Unable to decode jwt')\n        }\n    }\n}\n","import {getApis} from \"@propelauth/node-apis\";\nimport {getAuthUrl, getIntegrationApiKey} from \"./shared\";\n\nexport const getPropelAuthApis = () => {\n    const authUrl = getAuthUrl()\n    const integrationApiKey = getIntegrationApiKey()\n\n    return getApis(authUrl, integrationApiKey)\n}"],"mappings":"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","names":[]}
         | 
| @@ -2,6 +2,7 @@ import { GetServerSidePropsContext, NextApiRequest, NextApiResponse } from 'next | |
| 2 2 |  | 
| 3 3 | 
             
            declare class UserFromToken {
         | 
| 4 4 | 
             
                userId: string;
         | 
| 5 | 
            +
                activeOrgId?: string;
         | 
| 5 6 | 
             
                orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo;
         | 
| 6 7 | 
             
                email: string;
         | 
| 7 8 | 
             
                firstName?: string;
         | 
| @@ -14,12 +15,15 @@ declare class UserFromToken { | |
| 14 15 | 
             
                impersonatorUserId?: string;
         | 
| 15 16 | 
             
                constructor(userId: string, email: string, orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo, firstName?: string, lastName?: string, username?: string, legacyUserId?: string, impersonatorUserId?: string, properties?: {
         | 
| 16 17 | 
             
                    [key: string]: unknown;
         | 
| 17 | 
            -
                });
         | 
| 18 | 
            +
                }, activeOrgId?: string);
         | 
| 19 | 
            +
                getActiveOrg(): OrgMemberInfo | undefined;
         | 
| 20 | 
            +
                getActiveOrgId(): string | undefined;
         | 
| 18 21 | 
             
                getOrg(orgId: string): OrgMemberInfo | undefined;
         | 
| 19 22 | 
             
                getOrgByName(orgName: string): OrgMemberInfo | undefined;
         | 
| 20 23 | 
             
                getOrgs(): OrgMemberInfo[];
         | 
| 21 24 | 
             
                isImpersonating(): boolean;
         | 
| 22 25 | 
             
                static fromJSON(json: string): UserFromToken;
         | 
| 26 | 
            +
                static fromJwtPayload(payload: InternalUser): UserFromToken;
         | 
| 23 27 | 
             
            }
         | 
| 24 28 | 
             
            type OrgIdToOrgMemberInfo = {
         | 
| 25 29 | 
             
                [orgId: string]: OrgMemberInfo;
         | 
| @@ -46,6 +50,33 @@ declare class OrgMemberInfo { | |
| 46 50 | 
             
                get inheritedRolesPlusCurrentRole(): string[];
         | 
| 47 51 | 
             
                get permissions(): string[];
         | 
| 48 52 | 
             
            }
         | 
| 53 | 
            +
            type InternalOrgMemberInfo = {
         | 
| 54 | 
            +
                org_id: string;
         | 
| 55 | 
            +
                org_name: string;
         | 
| 56 | 
            +
                org_metadata: {
         | 
| 57 | 
            +
                    [key: string]: any;
         | 
| 58 | 
            +
                };
         | 
| 59 | 
            +
                url_safe_org_name: string;
         | 
| 60 | 
            +
                user_role: string;
         | 
| 61 | 
            +
                inherited_user_roles_plus_current_role: string[];
         | 
| 62 | 
            +
                user_permissions: string[];
         | 
| 63 | 
            +
            };
         | 
| 64 | 
            +
            type InternalUser = {
         | 
| 65 | 
            +
                user_id: string;
         | 
| 66 | 
            +
                org_member_info?: InternalOrgMemberInfo;
         | 
| 67 | 
            +
                org_id_to_org_member_info?: {
         | 
| 68 | 
            +
                    [org_id: string]: InternalOrgMemberInfo;
         | 
| 69 | 
            +
                };
         | 
| 70 | 
            +
                email: string;
         | 
| 71 | 
            +
                first_name?: string;
         | 
| 72 | 
            +
                last_name?: string;
         | 
| 73 | 
            +
                username?: string;
         | 
| 74 | 
            +
                properties?: {
         | 
| 75 | 
            +
                    [key: string]: unknown;
         | 
| 76 | 
            +
                };
         | 
| 77 | 
            +
                legacy_user_id?: string;
         | 
| 78 | 
            +
                impersonatorUserId?: string;
         | 
| 79 | 
            +
            };
         | 
| 49 80 |  | 
| 50 81 | 
             
            declare function getUserFromServerSideProps(props: GetServerSidePropsContext, forceRefresh?: boolean): Promise<UserFromToken | undefined>;
         | 
| 51 82 | 
             
            declare function getUserFromApiRouteRequest(req: NextApiRequest, res: NextApiResponse): Promise<UserFromToken | undefined>;
         | 
| @@ -57,8 +57,9 @@ module.exports = __toCommonJS(pages_index_exports); | |
| 57 57 |  | 
| 58 58 | 
             
            // src/user.ts
         | 
| 59 59 | 
             
            var UserFromToken = class {
         | 
| 60 | 
            -
              constructor(userId, email, orgIdToOrgMemberInfo, firstName, lastName, username, legacyUserId, impersonatorUserId, properties) {
         | 
| 60 | 
            +
              constructor(userId, email, orgIdToOrgMemberInfo, firstName, lastName, username, legacyUserId, impersonatorUserId, properties, activeOrgId) {
         | 
| 61 61 | 
             
                this.userId = userId;
         | 
| 62 | 
            +
                this.activeOrgId = activeOrgId;
         | 
| 62 63 | 
             
                this.orgIdToOrgMemberInfo = orgIdToOrgMemberInfo;
         | 
| 63 64 | 
             
                this.email = email;
         | 
| 64 65 | 
             
                this.firstName = firstName;
         | 
| @@ -68,6 +69,15 @@ var UserFromToken = class { | |
| 68 69 | 
             
                this.impersonatorUserId = impersonatorUserId;
         | 
| 69 70 | 
             
                this.properties = properties;
         | 
| 70 71 | 
             
              }
         | 
| 72 | 
            +
              getActiveOrg() {
         | 
| 73 | 
            +
                if (!this.activeOrgId || !this.orgIdToOrgMemberInfo) {
         | 
| 74 | 
            +
                  return void 0;
         | 
| 75 | 
            +
                }
         | 
| 76 | 
            +
                return this.orgIdToOrgMemberInfo[this.activeOrgId];
         | 
| 77 | 
            +
              }
         | 
| 78 | 
            +
              getActiveOrgId() {
         | 
| 79 | 
            +
                return this.activeOrgId;
         | 
| 80 | 
            +
              }
         | 
| 71 81 | 
             
              getOrg(orgId) {
         | 
| 72 82 | 
             
                if (!this.orgIdToOrgMemberInfo) {
         | 
| 73 83 | 
             
                  return void 0;
         | 
| @@ -100,9 +110,7 @@ var UserFromToken = class { | |
| 100 110 | 
             
                const obj = JSON.parse(json);
         | 
| 101 111 | 
             
                const orgIdToOrgMemberInfo = {};
         | 
| 102 112 | 
             
                for (const orgId in obj.orgIdToOrgMemberInfo) {
         | 
| 103 | 
            -
                  orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(
         | 
| 104 | 
            -
                    JSON.stringify(obj.orgIdToOrgMemberInfo[orgId])
         | 
| 105 | 
            -
                  );
         | 
| 113 | 
            +
                  orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(JSON.stringify(obj.orgIdToOrgMemberInfo[orgId]));
         | 
| 106 114 | 
             
                }
         | 
| 107 115 | 
             
                return new UserFromToken(
         | 
| 108 116 | 
             
                  obj.userId,
         | 
| @@ -116,6 +124,29 @@ var UserFromToken = class { | |
| 116 124 | 
             
                  obj.properties
         | 
| 117 125 | 
             
                );
         | 
| 118 126 | 
             
              }
         | 
| 127 | 
            +
              static fromJwtPayload(payload) {
         | 
| 128 | 
            +
                let activeOrgId;
         | 
| 129 | 
            +
                let orgIdToOrgMemberInfo;
         | 
| 130 | 
            +
                if (payload.org_member_info) {
         | 
| 131 | 
            +
                  activeOrgId = payload.org_member_info.org_id;
         | 
| 132 | 
            +
                  orgIdToOrgMemberInfo = toOrgIdToOrgMemberInfo({ [activeOrgId]: payload.org_member_info });
         | 
| 133 | 
            +
                } else {
         | 
| 134 | 
            +
                  activeOrgId = void 0;
         | 
| 135 | 
            +
                  orgIdToOrgMemberInfo = toOrgIdToOrgMemberInfo(payload.org_id_to_org_member_info);
         | 
| 136 | 
            +
                }
         | 
| 137 | 
            +
                return new UserFromToken(
         | 
| 138 | 
            +
                  payload.user_id,
         | 
| 139 | 
            +
                  payload.email,
         | 
| 140 | 
            +
                  orgIdToOrgMemberInfo,
         | 
| 141 | 
            +
                  payload.first_name,
         | 
| 142 | 
            +
                  payload.last_name,
         | 
| 143 | 
            +
                  payload.username,
         | 
| 144 | 
            +
                  payload.legacy_user_id,
         | 
| 145 | 
            +
                  payload.impersonatorUserId,
         | 
| 146 | 
            +
                  payload.properties,
         | 
| 147 | 
            +
                  activeOrgId
         | 
| 148 | 
            +
                );
         | 
| 149 | 
            +
              }
         | 
| 119 150 | 
             
            };
         | 
| 120 151 | 
             
            var OrgMemberInfo = class {
         | 
| 121 152 | 
             
              constructor(orgId, orgName, orgMetadata, urlSafeOrgName, userAssignedRole, userInheritedRolesPlusCurrentRole, userPermissions) {
         | 
| @@ -164,17 +195,7 @@ var OrgMemberInfo = class { | |
| 164 195 | 
             
              }
         | 
| 165 196 | 
             
            };
         | 
| 166 197 | 
             
            function toUser(snake_case) {
         | 
| 167 | 
            -
              return  | 
| 168 | 
            -
                snake_case.user_id,
         | 
| 169 | 
            -
                snake_case.email,
         | 
| 170 | 
            -
                toOrgIdToOrgMemberInfo(snake_case.org_id_to_org_member_info),
         | 
| 171 | 
            -
                snake_case.first_name,
         | 
| 172 | 
            -
                snake_case.last_name,
         | 
| 173 | 
            -
                snake_case.username,
         | 
| 174 | 
            -
                snake_case.legacy_user_id,
         | 
| 175 | 
            -
                snake_case.impersonatorUserId,
         | 
| 176 | 
            -
                snake_case.properties
         | 
| 177 | 
            -
              );
         | 
| 198 | 
            +
              return UserFromToken.fromJwtPayload(snake_case);
         | 
| 178 199 | 
             
            }
         | 
| 179 200 | 
             
            function toOrgIdToOrgMemberInfo(snake_case) {
         | 
| 180 201 | 
             
              if (snake_case === void 0) {
         | 
| @@ -242,12 +263,17 @@ function getVerifierKey() { | |
| 242 263 | 
             
              }
         | 
| 243 264 | 
             
              return verifierKey.replace(/\\n/g, "\n");
         | 
| 244 265 | 
             
            }
         | 
| 245 | 
            -
            function refreshTokenWithAccessAndRefreshToken(refreshToken) {
         | 
| 266 | 
            +
            function refreshTokenWithAccessAndRefreshToken(refreshToken, activeOrgId) {
         | 
| 246 267 | 
             
              return __async(this, null, function* () {
         | 
| 247 268 | 
             
                const body = {
         | 
| 248 269 | 
             
                  refresh_token: refreshToken
         | 
| 249 270 | 
             
                };
         | 
| 250 | 
            -
                const  | 
| 271 | 
            +
                const queryParams = new URLSearchParams();
         | 
| 272 | 
            +
                if (activeOrgId) {
         | 
| 273 | 
            +
                  queryParams.set("with_active_org_support", "true");
         | 
| 274 | 
            +
                  queryParams.set("active_org_id", activeOrgId);
         | 
| 275 | 
            +
                }
         | 
| 276 | 
            +
                const url = `${getAuthUrlOrigin()}/api/backend/v1/refresh_token?${queryParams.toString()}`;
         | 
| 251 277 | 
             
                const response = yield fetch(url, {
         | 
| 252 278 | 
             
                  method: "POST",
         | 
| 253 279 | 
             
                  body: JSON.stringify(body),
         | 
| @@ -259,10 +285,7 @@ function refreshTokenWithAccessAndRefreshToken(refreshToken) { | |
| 259 285 | 
             
                if (response.ok) {
         | 
| 260 286 | 
             
                  const data = yield response.json();
         | 
| 261 287 | 
             
                  const newRefreshToken = data.refresh_token;
         | 
| 262 | 
            -
                  const {
         | 
| 263 | 
            -
                    access_token: accessToken,
         | 
| 264 | 
            -
                    expires_at_seconds: expiresAtSeconds
         | 
| 265 | 
            -
                  } = data.access_token;
         | 
| 288 | 
            +
                  const { access_token: accessToken, expires_at_seconds: expiresAtSeconds } = data.access_token;
         | 
| 266 289 | 
             
                  return {
         | 
| 267 290 | 
             
                    refreshToken: newRefreshToken,
         | 
| 268 291 | 
             
                    accessToken,
         | 
| @@ -323,11 +346,15 @@ function validateAccessToken(accessToken) { | |
| 323 346 | 
             
              });
         | 
| 324 347 | 
             
            }
         | 
| 325 348 |  | 
| 349 | 
            +
            // src/shared.ts
         | 
| 350 | 
            +
            var ACTIVE_ORG_ID_COOKIE_NAME = "__pa_org_id";
         | 
| 351 | 
            +
             | 
| 326 352 | 
             
            // src/server/pages.ts
         | 
| 327 353 | 
             
            function getUserFromServerSideProps(props, forceRefresh = false) {
         | 
| 328 354 | 
             
              return __async(this, null, function* () {
         | 
| 329 355 | 
             
                const accessToken = props.req.cookies[ACCESS_TOKEN_COOKIE_NAME];
         | 
| 330 356 | 
             
                const refreshToken = props.req.cookies[REFRESH_TOKEN_COOKIE_NAME];
         | 
| 357 | 
            +
                const activeOrgId = props.req.cookies[ACTIVE_ORG_ID_COOKIE_NAME];
         | 
| 331 358 | 
             
                if (accessToken && !forceRefresh) {
         | 
| 332 359 | 
             
                  const user = yield validateAccessTokenOrUndefined(accessToken);
         | 
| 333 360 | 
             
                  if (user) {
         | 
| @@ -335,7 +362,7 @@ function getUserFromServerSideProps(props, forceRefresh = false) { | |
| 335 362 | 
             
                  }
         | 
| 336 363 | 
             
                }
         | 
| 337 364 | 
             
                if (refreshToken) {
         | 
| 338 | 
            -
                  const response = yield refreshTokenWithAccessAndRefreshToken(refreshToken);
         | 
| 365 | 
            +
                  const response = yield refreshTokenWithAccessAndRefreshToken(refreshToken, activeOrgId);
         | 
| 339 366 | 
             
                  if (response.error === "unexpected") {
         | 
| 340 367 | 
             
                    throw new Error("Unexpected error while refreshing access token");
         | 
| 341 368 | 
             
                  } else if (response.error === "unauthorized") {
         | 
| @@ -360,6 +387,7 @@ function getUserFromApiRouteRequest(req, res) { | |
| 360 387 | 
             
              return __async(this, null, function* () {
         | 
| 361 388 | 
             
                const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME];
         | 
| 362 389 | 
             
                const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME];
         | 
| 390 | 
            +
                const activeOrgId = req.cookies[ACTIVE_ORG_ID_COOKIE_NAME];
         | 
| 363 391 | 
             
                if (accessToken) {
         | 
| 364 392 | 
             
                  const user = yield validateAccessTokenOrUndefined(accessToken);
         | 
| 365 393 | 
             
                  if (user) {
         | 
| @@ -367,7 +395,7 @@ function getUserFromApiRouteRequest(req, res) { | |
| 367 395 | 
             
                  }
         | 
| 368 396 | 
             
                }
         | 
| 369 397 | 
             
                if (refreshToken) {
         | 
| 370 | 
            -
                  const response = yield refreshTokenWithAccessAndRefreshToken(refreshToken);
         | 
| 398 | 
            +
                  const response = yield refreshTokenWithAccessAndRefreshToken(refreshToken, activeOrgId);
         | 
| 371 399 | 
             
                  if (response.error === "unexpected") {
         | 
| 372 400 | 
             
                    throw new Error("Unexpected error while refreshing access token");
         | 
| 373 401 | 
             
                  } else if (response.error === "unauthorized") {
         | 
| @@ -1 +1 @@ | |
| 1 | 
            -
            {"version":3,"sources":["../../../src/server/pages-index.ts","../../../src/user.ts","../../../src/server/exceptions.ts","../../../src/server/shared.ts","../../../src/server/pages.ts"],"sourcesContent":["export {getUserFromServerSideProps, getUserFromApiRouteRequest} from \"./pages\"","export class UserFromToken {\n    public userId: string\n    public orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo\n\n    // Metadata about the user\n    public email: string\n    public firstName?: string\n    public lastName?: string\n    public username?: string\n    public properties?: { [key: string]: unknown }\n\n    // If you used our migration APIs to migrate this user from a different system,\n    //   this is their original ID from that system.\n    public legacyUserId?: string\n    public impersonatorUserId?: string\n\n    constructor(\n        userId: string,\n        email: string,\n        orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo,\n        firstName?: string,\n        lastName?: string,\n        username?: string,\n        legacyUserId?: string,\n        impersonatorUserId?: string,\n        properties?: { [key: string]: unknown },\n    ) {\n        this.userId = userId\n        this.orgIdToOrgMemberInfo = orgIdToOrgMemberInfo\n\n        this.email = email\n        this.firstName = firstName\n        this.lastName = lastName\n        this.username = username\n\n        this.legacyUserId = legacyUserId\n        this.impersonatorUserId = impersonatorUserId\n\n        this.properties = properties\n    }\n\n    public getOrg(orgId: string): OrgMemberInfo | undefined {\n        if (!this.orgIdToOrgMemberInfo) {\n            return undefined\n        }\n\n        return this.orgIdToOrgMemberInfo[orgId]\n    }\n\n    public getOrgByName(orgName: string): OrgMemberInfo | undefined {\n        if (!this.orgIdToOrgMemberInfo) {\n            return undefined\n        }\n\n        const urlSafeOrgName = orgName.toLowerCase().replace(/ /g, \"-\")\n        for (const orgId in this.orgIdToOrgMemberInfo) {\n            const orgMemberInfo = this.orgIdToOrgMemberInfo[orgId]\n            if (orgMemberInfo.urlSafeOrgName === urlSafeOrgName) {\n                return orgMemberInfo\n            }\n        }\n\n        return undefined\n    }\n\n    public getOrgs(): OrgMemberInfo[] {\n        if (!this.orgIdToOrgMemberInfo) {\n            return []\n        }\n\n        return Object.values(this.orgIdToOrgMemberInfo)\n    }\n\n    public isImpersonating(): boolean {\n        return !!this.impersonatorUserId\n    }\n\n    public static fromJSON(json: string): UserFromToken {\n        const obj = JSON.parse(json)\n        const orgIdToOrgMemberInfo: OrgIdToOrgMemberInfo = {}\n        for (const orgId in obj.orgIdToOrgMemberInfo) {\n            orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(\n                JSON.stringify(obj.orgIdToOrgMemberInfo[orgId])\n            )\n        }\n        return new UserFromToken(\n            obj.userId,\n            obj.email,\n            orgIdToOrgMemberInfo,\n            obj.firstName,\n            obj.lastName,\n            obj.username,\n            obj.legacyUserId,\n            obj.impersonatorUserId,\n            obj.properties,\n        )\n    }\n}\n\nexport type OrgIdToOrgMemberInfo = {\n    [orgId: string]: OrgMemberInfo\n}\n\nexport class OrgMemberInfo {\n    public orgId: string\n    public orgName: string\n    public orgMetadata: { [key: string]: any }\n    public urlSafeOrgName: string\n\n    public userAssignedRole: string\n    public userInheritedRolesPlusCurrentRole: string[]\n    public userPermissions: string[]\n\n    constructor(\n        orgId: string,\n        orgName: string,\n        orgMetadata: { [key: string]: any },\n        urlSafeOrgName: string,\n        userAssignedRole: string,\n        userInheritedRolesPlusCurrentRole: string[],\n        userPermissions: string[]\n    ) {\n        this.orgId = orgId\n        this.orgName = orgName\n        this.orgMetadata = orgMetadata\n        this.urlSafeOrgName = urlSafeOrgName\n\n        this.userAssignedRole = userAssignedRole\n        this.userInheritedRolesPlusCurrentRole = userInheritedRolesPlusCurrentRole\n        this.userPermissions = userPermissions\n    }\n\n    // validation methods\n\n    public isRole(role: string): boolean {\n        return this.userAssignedRole === role\n    }\n\n    public isAtLeastRole(role: string): boolean {\n        return this.userInheritedRolesPlusCurrentRole.includes(role)\n    }\n\n    public hasPermission(permission: string): boolean {\n        return this.userPermissions.includes(permission)\n    }\n\n    public hasAllPermissions(permissions: string[]): boolean {\n        return permissions.every((permission) => this.hasPermission(permission))\n    }\n\n    public static fromJSON(json: string): OrgMemberInfo {\n        const obj = JSON.parse(json)\n        return new OrgMemberInfo(\n            obj.orgId,\n            obj.orgName,\n            obj.orgMetadata,\n            obj.urlSafeOrgName,\n            obj.userAssignedRole,\n            obj.userInheritedRolesPlusCurrentRole,\n            obj.userPermissions\n        )\n    }\n\n    // getters for the private fields\n\n    get assignedRole(): string {\n        return this.userAssignedRole\n    }\n\n    get inheritedRolesPlusCurrentRole(): string[] {\n        return this.userInheritedRolesPlusCurrentRole\n    }\n\n    get permissions(): string[] {\n        return this.userPermissions\n    }\n}\n\n// These Internal types exist since the server returns snake case, but typescript/javascript\n// convention is camelCase.\nexport type InternalOrgMemberInfo = {\n    org_id: string\n    org_name: string\n    org_metadata: { [key: string]: any }\n    url_safe_org_name: string\n    user_role: string\n    inherited_user_roles_plus_current_role: string[]\n    user_permissions: string[]\n}\nexport type InternalUser = {\n    user_id: string\n    org_id_to_org_member_info?: { [org_id: string]: InternalOrgMemberInfo }\n\n    email: string\n    first_name?: string\n    last_name?: string\n    username?: string\n    properties?: { [key: string]: unknown }\n\n    // If you used our migration APIs to migrate this user from a different system, this is their original ID from that system.\n    legacy_user_id?: string\n    impersonatorUserId?: string\n}\n\nexport function toUser(snake_case: InternalUser): UserFromToken {\n    return new UserFromToken(\n        snake_case.user_id,\n        snake_case.email,\n        toOrgIdToOrgMemberInfo(snake_case.org_id_to_org_member_info),\n        snake_case.first_name,\n        snake_case.last_name,\n        snake_case.username,\n        snake_case.legacy_user_id,\n        snake_case.impersonatorUserId,\n        snake_case.properties,\n    )\n}\n\nexport function toOrgIdToOrgMemberInfo(snake_case?: {\n    [org_id: string]: InternalOrgMemberInfo\n}): OrgIdToOrgMemberInfo | undefined {\n    if (snake_case === undefined) {\n        return undefined\n    }\n    const camelCase: OrgIdToOrgMemberInfo = {}\n\n    for (const key of Object.keys(snake_case)) {\n        const snakeCaseValue = snake_case[key]\n        if (snakeCaseValue) {\n            camelCase[key] = new OrgMemberInfo(\n                snakeCaseValue.org_id,\n                snakeCaseValue.org_name,\n                snakeCaseValue.org_metadata,\n                snakeCaseValue.url_safe_org_name,\n                snakeCaseValue.user_role,\n                snakeCaseValue.inherited_user_roles_plus_current_role,\n                snakeCaseValue.user_permissions\n            )\n        }\n    }\n\n    return camelCase\n}\n","export class UnauthorizedException extends Error {\n    readonly message: string\n    readonly status: number\n\n    constructor(message: string) {\n        super(message)\n        this.message = message\n        this.status = 401\n    }\n}\n\nexport class ConfigurationException extends Error {\n    readonly message: string\n    readonly status: number\n\n    constructor(message: string) {\n        super(message)\n        this.message = message\n        this.status = 500\n    }\n}\n","import {ResponseCookie} from \"next/dist/compiled/@edge-runtime/cookies\";\nimport {InternalUser, toUser, UserFromToken} from \"../user\";\nimport {ConfigurationException, UnauthorizedException} from \"./exceptions\";\nimport * as jose from \"jose\";\n\ntype RefreshAndAccessTokens = {\n    refreshToken: string\n    accessToken: string\n    error: \"none\"\n}\n\ntype RefreshAndAccessTokensUnauthorizedError = {\n    error: \"unauthorized\"\n}\n\ntype RefreshAndAccessTokensUnexpectedError = {\n    error: \"unexpected\"\n}\n\nexport type RefreshTokenResponse =\n    RefreshAndAccessTokens\n    | RefreshAndAccessTokensUnauthorizedError\n    | RefreshAndAccessTokensUnexpectedError\n\nexport const LOGIN_PATH = \"/api/auth/login\"\nexport const CALLBACK_PATH = \"/api/auth/callback\"\nexport const USERINFO_PATH = \"/api/auth/userinfo\"\nexport const LOGOUT_PATH = \"/api/auth/logout\"\nexport const ACCESS_TOKEN_COOKIE_NAME = \"__pa_at\"\nexport const REFRESH_TOKEN_COOKIE_NAME = \"__pa_rt\"\nexport const STATE_COOKIE_NAME = \"__pa_state\"\nexport const CUSTOM_HEADER_FOR_ACCESS_TOKEN = \"x-propelauth-access-token\"\nexport const RETURN_TO_PATH_COOKIE_NAME = \"__pa_return_to_path\"\n\nexport const COOKIE_OPTIONS: Partial<ResponseCookie> = {\n    httpOnly: true,\n    sameSite: \"lax\",\n    secure: true,\n    path: \"/\",\n}\n\nexport function getAuthUrlOrigin() {\n    return getAuthUrl().origin\n}\n\nexport function getAuthUrl() {\n    const authUrl = process.env.NEXT_PUBLIC_AUTH_URL\n    if (!authUrl) {\n        throw new Error(\"NEXT_PUBLIC_AUTH_URL is not set\")\n    }\n    return new URL(authUrl)\n}\n\nexport function getRedirectUri() {\n    const redirectUri = process.env.PROPELAUTH_REDIRECT_URI\n    if (!redirectUri) {\n        throw new Error(\"PROPELAUTH_REDIRECT_URI is not set\")\n    }\n    return redirectUri\n}\n\nexport function getIntegrationApiKey() {\n    const integrationApiKey = process.env.PROPELAUTH_API_KEY\n    if (!integrationApiKey) {\n        throw new Error(\"PROPELAUTH_API_KEY is not set\")\n    }\n    return integrationApiKey\n}\n\nexport function getVerifierKey() {\n    const verifierKey = process.env.PROPELAUTH_VERIFIER_KEY\n    if (!verifierKey) {\n        throw new Error(\"PROPELAUTH_VERIFIER_KEY is not set\")\n    }\n    return verifierKey.replace(/\\\\n/g, \"\\n\")\n}\n\nexport async function refreshTokenWithAccessAndRefreshToken(refreshToken: string): Promise<RefreshTokenResponse> {\n    const body = {\n        refresh_token: refreshToken,\n    }\n    const url = `${getAuthUrlOrigin()}/api/backend/v1/refresh_token`\n    const response = await fetch(url, {\n        method: \"POST\",\n        body: JSON.stringify(body),\n        headers: {\n            \"Content-Type\": \"application/json\",\n            Authorization: \"Bearer \" + getIntegrationApiKey(),\n        },\n    })\n\n    if (response.ok) {\n        const data = await response.json()\n        const newRefreshToken = data.refresh_token\n        const {\n            access_token: accessToken,\n            expires_at_seconds: expiresAtSeconds,\n        } = data.access_token\n\n        return {\n            refreshToken: newRefreshToken,\n            accessToken,\n            error: \"none\",\n        }\n    } else if (response.status === 400 || response.status === 401) {\n        return {error: \"unauthorized\"}\n    } else {\n        return {error: \"unexpected\"}\n    }\n}\n\nexport async function validateAccessTokenOrUndefined(accessToken: string | undefined): Promise<UserFromToken | undefined> {\n    try {\n        return await validateAccessToken(accessToken)\n    } catch (err) {\n        if (err instanceof ConfigurationException) {\n            throw err\n        } else if (err instanceof UnauthorizedException) {\n            return undefined\n        } else {\n            console.info(\"Error validating access token\", err)\n            return undefined\n        }\n    }\n}\n\nexport async function validateAccessToken(accessToken: string | undefined): Promise<UserFromToken> {\n    let publicKey\n    try {\n        publicKey = await jose.importSPKI(getVerifierKey(), \"RS256\")\n    } catch (err) {\n        console.error(\"Verifier key is invalid. Make sure it's specified correctly, including the newlines.\", err)\n        throw new ConfigurationException(\"Invalid verifier key\")\n    }\n\n    if (!accessToken) {\n        throw new UnauthorizedException(\"No access token provided\")\n    }\n\n    let accessTokenWithoutBearer = accessToken\n    if (accessToken.toLowerCase().startsWith(\"bearer \")) {\n        accessTokenWithoutBearer = accessToken.substring(\"bearer \".length)\n    }\n\n    try {\n        const {payload} = await jose.jwtVerify(accessTokenWithoutBearer, publicKey, {\n            issuer: getAuthUrlOrigin(),\n            algorithms: [\"RS256\"],\n        })\n\n        return toUser(<InternalUser>payload)\n    } catch (e) {\n        if (e instanceof Error) {\n            throw new UnauthorizedException(e.message)\n        } else {\n            throw new UnauthorizedException(\"Unable to decode jwt\")\n        }\n    }\n}\n","import {GetServerSidePropsContext, NextApiRequest, NextApiResponse} from \"next\";\nimport {\n    ACCESS_TOKEN_COOKIE_NAME,\n    REFRESH_TOKEN_COOKIE_NAME,\n    refreshTokenWithAccessAndRefreshToken, validateAccessToken,\n    validateAccessTokenOrUndefined\n} from \"./shared\";\n\nexport async function getUserFromServerSideProps(props: GetServerSidePropsContext, forceRefresh: boolean = false) {\n    const accessToken = props.req.cookies[ACCESS_TOKEN_COOKIE_NAME]\n    const refreshToken = props.req.cookies[REFRESH_TOKEN_COOKIE_NAME]\n\n    // If we are authenticated, we can continue\n    if (accessToken && !forceRefresh) {\n        const user = await validateAccessTokenOrUndefined(accessToken)\n        if (user) {\n            return user\n        }\n    }\n\n    // Otherwise, we need to refresh the access token\n    if (refreshToken) {\n        const response = await refreshTokenWithAccessAndRefreshToken(refreshToken)\n        if (response.error === \"unexpected\") {\n            throw new Error(\"Unexpected error while refreshing access token\")\n        } else if (response.error === \"unauthorized\") {\n            props.res.setHeader(\"Set-Cookie\", [\n                `${ACCESS_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`,\n                `${REFRESH_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`,\n            ])\n            return undefined\n        } else {\n            const user = await validateAccessToken(response.accessToken)\n            props.res.setHeader(\"Set-Cookie\", [\n                `${ACCESS_TOKEN_COOKIE_NAME}=${response.accessToken}; Path=/; HttpOnly; Secure; SameSite=Lax`,\n                `${REFRESH_TOKEN_COOKIE_NAME}=${response.refreshToken}; Path=/; HttpOnly; Secure; SameSite=Lax`,\n            ])\n            return user\n        }\n    }\n\n    return undefined\n}\n\nexport async function getUserFromApiRouteRequest(req: NextApiRequest, res: NextApiResponse) {\n    const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME]\n    const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME]\n\n    // If we are authenticated, we can continue\n    if (accessToken) {\n        const user = await validateAccessTokenOrUndefined(accessToken)\n        if (user) {\n            return user\n        }\n    }\n\n    // Otherwise, we need to refresh the access token\n    if (refreshToken) {\n        const response = await refreshTokenWithAccessAndRefreshToken(refreshToken)\n        if (response.error === \"unexpected\") {\n            throw new Error(\"Unexpected error while refreshing access token\")\n        } else if (response.error === \"unauthorized\") {\n            res.setHeader(\"Set-Cookie\", [\n                `${ACCESS_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`,\n                `${REFRESH_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`,\n            ])\n            return undefined\n        } else {\n            const user = await validateAccessToken(response.accessToken)\n            res.setHeader(\"Set-Cookie\", [\n                `${ACCESS_TOKEN_COOKIE_NAME}=${response.accessToken}; Path=/; HttpOnly; Secure; SameSite=Lax`,\n                `${REFRESH_TOKEN_COOKIE_NAME}=${response.refreshToken}; Path=/; HttpOnly; Secure; SameSite=Lax`,\n            ])\n            return user\n        }\n    }\n\n    return undefined\n\n}"],"mappings":"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","names":[]}
         | 
| 1 | 
            +
            {"version":3,"sources":["../../../src/server/pages-index.ts","../../../src/user.ts","../../../src/server/exceptions.ts","../../../src/server/shared.ts","../../../src/shared.ts","../../../src/server/pages.ts"],"sourcesContent":["export {getUserFromServerSideProps, getUserFromApiRouteRequest} from \"./pages\"","export class UserFromToken {\n    public userId: string\n\n    public activeOrgId?: string\n    public orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo\n\n    // Metadata about the user\n    public email: string\n    public firstName?: string\n    public lastName?: string\n    public username?: string\n    public properties?: { [key: string]: unknown }\n\n    // If you used our migration APIs to migrate this user from a different system,\n    //   this is their original ID from that system.\n    public legacyUserId?: string\n    public impersonatorUserId?: string\n\n    constructor(\n        userId: string,\n        email: string,\n        orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo,\n        firstName?: string,\n        lastName?: string,\n        username?: string,\n        legacyUserId?: string,\n        impersonatorUserId?: string,\n        properties?: { [key: string]: unknown },\n        activeOrgId?: string\n    ) {\n        this.userId = userId\n\n        this.activeOrgId = activeOrgId\n        this.orgIdToOrgMemberInfo = orgIdToOrgMemberInfo\n\n        this.email = email\n        this.firstName = firstName\n        this.lastName = lastName\n        this.username = username\n\n        this.legacyUserId = legacyUserId\n        this.impersonatorUserId = impersonatorUserId\n\n        this.properties = properties\n    }\n\n    public getActiveOrg(): OrgMemberInfo | undefined {\n        if (!this.activeOrgId || !this.orgIdToOrgMemberInfo) {\n            return undefined\n        }\n\n        return this.orgIdToOrgMemberInfo[this.activeOrgId]\n    }\n\n    public getActiveOrgId(): string | undefined {\n        return this.activeOrgId\n    }\n\n    public getOrg(orgId: string): OrgMemberInfo | undefined {\n        if (!this.orgIdToOrgMemberInfo) {\n            return undefined\n        }\n\n        return this.orgIdToOrgMemberInfo[orgId]\n    }\n\n    public getOrgByName(orgName: string): OrgMemberInfo | undefined {\n        if (!this.orgIdToOrgMemberInfo) {\n            return undefined\n        }\n\n        const urlSafeOrgName = orgName.toLowerCase().replace(/ /g, '-')\n        for (const orgId in this.orgIdToOrgMemberInfo) {\n            const orgMemberInfo = this.orgIdToOrgMemberInfo[orgId]\n            if (orgMemberInfo.urlSafeOrgName === urlSafeOrgName) {\n                return orgMemberInfo\n            }\n        }\n\n        return undefined\n    }\n\n    public getOrgs(): OrgMemberInfo[] {\n        if (!this.orgIdToOrgMemberInfo) {\n            return []\n        }\n\n        return Object.values(this.orgIdToOrgMemberInfo)\n    }\n\n    public isImpersonating(): boolean {\n        return !!this.impersonatorUserId\n    }\n\n    public static fromJSON(json: string): UserFromToken {\n        const obj = JSON.parse(json)\n        const orgIdToOrgMemberInfo: OrgIdToOrgMemberInfo = {}\n        for (const orgId in obj.orgIdToOrgMemberInfo) {\n            orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(JSON.stringify(obj.orgIdToOrgMemberInfo[orgId]))\n        }\n        return new UserFromToken(\n            obj.userId,\n            obj.email,\n            orgIdToOrgMemberInfo,\n            obj.firstName,\n            obj.lastName,\n            obj.username,\n            obj.legacyUserId,\n            obj.impersonatorUserId,\n            obj.properties\n        )\n    }\n\n    public static fromJwtPayload(payload: InternalUser): UserFromToken {\n        let activeOrgId: string | undefined\n        let orgIdToOrgMemberInfo: OrgIdToOrgMemberInfo | undefined\n\n        if (payload.org_member_info) {\n            activeOrgId = payload.org_member_info.org_id\n            orgIdToOrgMemberInfo = toOrgIdToOrgMemberInfo({ [activeOrgId]: payload.org_member_info })\n        } else {\n            activeOrgId = undefined\n            orgIdToOrgMemberInfo = toOrgIdToOrgMemberInfo(payload.org_id_to_org_member_info)\n        }\n\n        return new UserFromToken(\n            payload.user_id,\n            payload.email,\n            orgIdToOrgMemberInfo,\n            payload.first_name,\n            payload.last_name,\n            payload.username,\n            payload.legacy_user_id,\n            payload.impersonatorUserId,\n            payload.properties,\n            activeOrgId\n        )\n    }\n}\n\nexport type OrgIdToOrgMemberInfo = {\n    [orgId: string]: OrgMemberInfo\n}\n\nexport class OrgMemberInfo {\n    public orgId: string\n    public orgName: string\n    public orgMetadata: { [key: string]: any }\n    public urlSafeOrgName: string\n\n    public userAssignedRole: string\n    public userInheritedRolesPlusCurrentRole: string[]\n    public userPermissions: string[]\n\n    constructor(\n        orgId: string,\n        orgName: string,\n        orgMetadata: { [key: string]: any },\n        urlSafeOrgName: string,\n        userAssignedRole: string,\n        userInheritedRolesPlusCurrentRole: string[],\n        userPermissions: string[]\n    ) {\n        this.orgId = orgId\n        this.orgName = orgName\n        this.orgMetadata = orgMetadata\n        this.urlSafeOrgName = urlSafeOrgName\n\n        this.userAssignedRole = userAssignedRole\n        this.userInheritedRolesPlusCurrentRole = userInheritedRolesPlusCurrentRole\n        this.userPermissions = userPermissions\n    }\n\n    // validation methods\n\n    public isRole(role: string): boolean {\n        return this.userAssignedRole === role\n    }\n\n    public isAtLeastRole(role: string): boolean {\n        return this.userInheritedRolesPlusCurrentRole.includes(role)\n    }\n\n    public hasPermission(permission: string): boolean {\n        return this.userPermissions.includes(permission)\n    }\n\n    public hasAllPermissions(permissions: string[]): boolean {\n        return permissions.every((permission) => this.hasPermission(permission))\n    }\n\n    public static fromJSON(json: string): OrgMemberInfo {\n        const obj = JSON.parse(json)\n        return new OrgMemberInfo(\n            obj.orgId,\n            obj.orgName,\n            obj.orgMetadata,\n            obj.urlSafeOrgName,\n            obj.userAssignedRole,\n            obj.userInheritedRolesPlusCurrentRole,\n            obj.userPermissions\n        )\n    }\n\n    // getters for the private fields\n\n    get assignedRole(): string {\n        return this.userAssignedRole\n    }\n\n    get inheritedRolesPlusCurrentRole(): string[] {\n        return this.userInheritedRolesPlusCurrentRole\n    }\n\n    get permissions(): string[] {\n        return this.userPermissions\n    }\n}\n\n// These Internal types exist since the server returns snake case, but typescript/javascript\n// convention is camelCase.\nexport type InternalOrgMemberInfo = {\n    org_id: string\n    org_name: string\n    org_metadata: { [key: string]: any }\n    url_safe_org_name: string\n    user_role: string\n    inherited_user_roles_plus_current_role: string[]\n    user_permissions: string[]\n}\nexport type InternalUser = {\n    user_id: string\n\n    org_member_info?: InternalOrgMemberInfo\n    org_id_to_org_member_info?: { [org_id: string]: InternalOrgMemberInfo }\n\n    email: string\n    first_name?: string\n    last_name?: string\n    username?: string\n    properties?: { [key: string]: unknown }\n\n    // If you used our migration APIs to migrate this user from a different system, this is their original ID from that system.\n    legacy_user_id?: string\n    impersonatorUserId?: string\n}\n\nexport function toUser(snake_case: InternalUser): UserFromToken {\n    return UserFromToken.fromJwtPayload(snake_case)\n}\n\nexport function toOrgIdToOrgMemberInfo(snake_case?: {\n    [org_id: string]: InternalOrgMemberInfo\n}): OrgIdToOrgMemberInfo | undefined {\n    if (snake_case === undefined) {\n        return undefined\n    }\n    const camelCase: OrgIdToOrgMemberInfo = {}\n\n    for (const key of Object.keys(snake_case)) {\n        const snakeCaseValue = snake_case[key]\n        if (snakeCaseValue) {\n            camelCase[key] = new OrgMemberInfo(\n                snakeCaseValue.org_id,\n                snakeCaseValue.org_name,\n                snakeCaseValue.org_metadata,\n                snakeCaseValue.url_safe_org_name,\n                snakeCaseValue.user_role,\n                snakeCaseValue.inherited_user_roles_plus_current_role,\n                snakeCaseValue.user_permissions\n            )\n        }\n    }\n\n    return camelCase\n}\n","export class UnauthorizedException extends Error {\n    readonly message: string\n    readonly status: number\n\n    constructor(message: string) {\n        super(message)\n        this.message = message\n        this.status = 401\n    }\n}\n\nexport class ConfigurationException extends Error {\n    readonly message: string\n    readonly status: number\n\n    constructor(message: string) {\n        super(message)\n        this.message = message\n        this.status = 500\n    }\n}\n","import { ResponseCookie } from 'next/dist/compiled/@edge-runtime/cookies'\nimport { InternalUser, toUser, UserFromToken } from '../user'\nimport { ConfigurationException, UnauthorizedException } from './exceptions'\nimport * as jose from 'jose'\n\ntype RefreshAndAccessTokens = {\n    refreshToken: string\n    accessToken: string\n    error: 'none'\n}\n\ntype RefreshAndAccessTokensUnauthorizedError = {\n    error: 'unauthorized'\n}\n\ntype RefreshAndAccessTokensUnexpectedError = {\n    error: 'unexpected'\n}\n\nexport type RefreshTokenResponse =\n    | RefreshAndAccessTokens\n    | RefreshAndAccessTokensUnauthorizedError\n    | RefreshAndAccessTokensUnexpectedError\n\nexport const LOGIN_PATH = '/api/auth/login'\nexport const CALLBACK_PATH = '/api/auth/callback'\nexport const USERINFO_PATH = '/api/auth/userinfo'\nexport const LOGOUT_PATH = '/api/auth/logout'\nexport const ACCESS_TOKEN_COOKIE_NAME = '__pa_at'\nexport const REFRESH_TOKEN_COOKIE_NAME = '__pa_rt'\nexport const STATE_COOKIE_NAME = '__pa_state'\nexport const CUSTOM_HEADER_FOR_ACCESS_TOKEN = 'x-propelauth-access-token'\nexport const RETURN_TO_PATH_COOKIE_NAME = '__pa_return_to_path'\n\nexport const COOKIE_OPTIONS: Partial<ResponseCookie> = {\n    httpOnly: true,\n    sameSite: 'lax',\n    secure: true,\n    path: '/',\n}\n\nexport function getAuthUrlOrigin() {\n    return getAuthUrl().origin\n}\n\nexport function getAuthUrl() {\n    const authUrl = process.env.NEXT_PUBLIC_AUTH_URL\n    if (!authUrl) {\n        throw new Error('NEXT_PUBLIC_AUTH_URL is not set')\n    }\n    return new URL(authUrl)\n}\n\nexport function getRedirectUri() {\n    const redirectUri = process.env.PROPELAUTH_REDIRECT_URI\n    if (!redirectUri) {\n        throw new Error('PROPELAUTH_REDIRECT_URI is not set')\n    }\n    return redirectUri\n}\n\nexport function getIntegrationApiKey() {\n    const integrationApiKey = process.env.PROPELAUTH_API_KEY\n    if (!integrationApiKey) {\n        throw new Error('PROPELAUTH_API_KEY is not set')\n    }\n    return integrationApiKey\n}\n\nexport function getVerifierKey() {\n    const verifierKey = process.env.PROPELAUTH_VERIFIER_KEY\n    if (!verifierKey) {\n        throw new Error('PROPELAUTH_VERIFIER_KEY is not set')\n    }\n    return verifierKey.replace(/\\\\n/g, '\\n')\n}\n\nexport async function refreshTokenWithAccessAndRefreshToken(\n    refreshToken: string,\n    activeOrgId?: string\n): Promise<RefreshTokenResponse> {\n    const body = {\n        refresh_token: refreshToken,\n    }\n\n    const queryParams = new URLSearchParams()\n    if (activeOrgId) {\n        queryParams.set('with_active_org_support', 'true')\n        queryParams.set('active_org_id', activeOrgId)\n    }\n\n    const url = `${getAuthUrlOrigin()}/api/backend/v1/refresh_token?${queryParams.toString()}`\n    const response = await fetch(url, {\n        method: 'POST',\n        body: JSON.stringify(body),\n        headers: {\n            'Content-Type': 'application/json',\n            Authorization: 'Bearer ' + getIntegrationApiKey(),\n        },\n    })\n\n    if (response.ok) {\n        const data = await response.json()\n        const newRefreshToken = data.refresh_token\n        const { access_token: accessToken, expires_at_seconds: expiresAtSeconds } = data.access_token\n\n        return {\n            refreshToken: newRefreshToken,\n            accessToken,\n            error: 'none',\n        }\n    } else if (response.status === 400 || response.status === 401) {\n        return { error: 'unauthorized' }\n    } else {\n        return { error: 'unexpected' }\n    }\n}\n\nexport async function validateAccessTokenOrUndefined(\n    accessToken: string | undefined\n): Promise<UserFromToken | undefined> {\n    try {\n        return await validateAccessToken(accessToken)\n    } catch (err) {\n        if (err instanceof ConfigurationException) {\n            throw err\n        } else if (err instanceof UnauthorizedException) {\n            return undefined\n        } else {\n            console.info('Error validating access token', err)\n            return undefined\n        }\n    }\n}\n\nexport async function validateAccessToken(accessToken: string | undefined): Promise<UserFromToken> {\n    let publicKey\n    try {\n        publicKey = await jose.importSPKI(getVerifierKey(), 'RS256')\n    } catch (err) {\n        console.error(\"Verifier key is invalid. Make sure it's specified correctly, including the newlines.\", err)\n        throw new ConfigurationException('Invalid verifier key')\n    }\n\n    if (!accessToken) {\n        throw new UnauthorizedException('No access token provided')\n    }\n\n    let accessTokenWithoutBearer = accessToken\n    if (accessToken.toLowerCase().startsWith('bearer ')) {\n        accessTokenWithoutBearer = accessToken.substring('bearer '.length)\n    }\n\n    try {\n        const { payload } = await jose.jwtVerify(accessTokenWithoutBearer, publicKey, {\n            issuer: getAuthUrlOrigin(),\n            algorithms: ['RS256'],\n        })\n\n        return toUser(<InternalUser>payload)\n    } catch (e) {\n        if (e instanceof Error) {\n            throw new UnauthorizedException(e.message)\n        } else {\n            throw new UnauthorizedException('Unable to decode jwt')\n        }\n    }\n}\n","export const ACTIVE_ORG_ID_COOKIE_NAME = '__pa_org_id'\n","import { GetServerSidePropsContext, NextApiRequest, NextApiResponse } from 'next'\nimport {\n    ACCESS_TOKEN_COOKIE_NAME,\n    REFRESH_TOKEN_COOKIE_NAME,\n    refreshTokenWithAccessAndRefreshToken,\n    validateAccessToken,\n    validateAccessTokenOrUndefined,\n} from './shared'\nimport { ACTIVE_ORG_ID_COOKIE_NAME } from '../shared'\n\nexport async function getUserFromServerSideProps(props: GetServerSidePropsContext, forceRefresh: boolean = false) {\n    const accessToken = props.req.cookies[ACCESS_TOKEN_COOKIE_NAME]\n    const refreshToken = props.req.cookies[REFRESH_TOKEN_COOKIE_NAME]\n    const activeOrgId = props.req.cookies[ACTIVE_ORG_ID_COOKIE_NAME]\n\n    // If we are authenticated, we can continue\n    if (accessToken && !forceRefresh) {\n        const user = await validateAccessTokenOrUndefined(accessToken)\n        if (user) {\n            return user\n        }\n    }\n\n    // Otherwise, we need to refresh the access token\n    if (refreshToken) {\n        const response = await refreshTokenWithAccessAndRefreshToken(refreshToken, activeOrgId)\n        if (response.error === 'unexpected') {\n            throw new Error('Unexpected error while refreshing access token')\n        } else if (response.error === 'unauthorized') {\n            props.res.setHeader('Set-Cookie', [\n                `${ACCESS_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`,\n                `${REFRESH_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`,\n            ])\n            return undefined\n        } else {\n            const user = await validateAccessToken(response.accessToken)\n            props.res.setHeader('Set-Cookie', [\n                `${ACCESS_TOKEN_COOKIE_NAME}=${response.accessToken}; Path=/; HttpOnly; Secure; SameSite=Lax`,\n                `${REFRESH_TOKEN_COOKIE_NAME}=${response.refreshToken}; Path=/; HttpOnly; Secure; SameSite=Lax`,\n            ])\n            return user\n        }\n    }\n\n    return undefined\n}\n\nexport async function getUserFromApiRouteRequest(req: NextApiRequest, res: NextApiResponse) {\n    const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME]\n    const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME]\n    const activeOrgId = req.cookies[ACTIVE_ORG_ID_COOKIE_NAME]\n\n    // If we are authenticated, we can continue\n    if (accessToken) {\n        const user = await validateAccessTokenOrUndefined(accessToken)\n        if (user) {\n            return user\n        }\n    }\n\n    // Otherwise, we need to refresh the access token\n    if (refreshToken) {\n        const response = await refreshTokenWithAccessAndRefreshToken(refreshToken, activeOrgId)\n        if (response.error === 'unexpected') {\n            throw new Error('Unexpected error while refreshing access token')\n        } else if (response.error === 'unauthorized') {\n            res.setHeader('Set-Cookie', [\n                `${ACCESS_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`,\n                `${REFRESH_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`,\n            ])\n            return undefined\n        } else {\n            const user = await validateAccessToken(response.accessToken)\n            res.setHeader('Set-Cookie', [\n                `${ACCESS_TOKEN_COOKIE_NAME}=${response.accessToken}; Path=/; HttpOnly; Secure; SameSite=Lax`,\n                `${REFRESH_TOKEN_COOKIE_NAME}=${response.refreshToken}; Path=/; HttpOnly; Secure; SameSite=Lax`,\n            ])\n            return user\n        }\n    }\n\n    return undefined\n}\n"],"mappings":"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","names":[]}
         | 
| @@ -21,8 +21,9 @@ var __async = (__this, __arguments, generator) => { | |
| 21 21 |  | 
| 22 22 | 
             
            // src/user.ts
         | 
| 23 23 | 
             
            var UserFromToken = class {
         | 
| 24 | 
            -
              constructor(userId, email, orgIdToOrgMemberInfo, firstName, lastName, username, legacyUserId, impersonatorUserId, properties) {
         | 
| 24 | 
            +
              constructor(userId, email, orgIdToOrgMemberInfo, firstName, lastName, username, legacyUserId, impersonatorUserId, properties, activeOrgId) {
         | 
| 25 25 | 
             
                this.userId = userId;
         | 
| 26 | 
            +
                this.activeOrgId = activeOrgId;
         | 
| 26 27 | 
             
                this.orgIdToOrgMemberInfo = orgIdToOrgMemberInfo;
         | 
| 27 28 | 
             
                this.email = email;
         | 
| 28 29 | 
             
                this.firstName = firstName;
         | 
| @@ -32,6 +33,15 @@ var UserFromToken = class { | |
| 32 33 | 
             
                this.impersonatorUserId = impersonatorUserId;
         | 
| 33 34 | 
             
                this.properties = properties;
         | 
| 34 35 | 
             
              }
         | 
| 36 | 
            +
              getActiveOrg() {
         | 
| 37 | 
            +
                if (!this.activeOrgId || !this.orgIdToOrgMemberInfo) {
         | 
| 38 | 
            +
                  return void 0;
         | 
| 39 | 
            +
                }
         | 
| 40 | 
            +
                return this.orgIdToOrgMemberInfo[this.activeOrgId];
         | 
| 41 | 
            +
              }
         | 
| 42 | 
            +
              getActiveOrgId() {
         | 
| 43 | 
            +
                return this.activeOrgId;
         | 
| 44 | 
            +
              }
         | 
| 35 45 | 
             
              getOrg(orgId) {
         | 
| 36 46 | 
             
                if (!this.orgIdToOrgMemberInfo) {
         | 
| 37 47 | 
             
                  return void 0;
         | 
| @@ -64,9 +74,7 @@ var UserFromToken = class { | |
| 64 74 | 
             
                const obj = JSON.parse(json);
         | 
| 65 75 | 
             
                const orgIdToOrgMemberInfo = {};
         | 
| 66 76 | 
             
                for (const orgId in obj.orgIdToOrgMemberInfo) {
         | 
| 67 | 
            -
                  orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(
         | 
| 68 | 
            -
                    JSON.stringify(obj.orgIdToOrgMemberInfo[orgId])
         | 
| 69 | 
            -
                  );
         | 
| 77 | 
            +
                  orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(JSON.stringify(obj.orgIdToOrgMemberInfo[orgId]));
         | 
| 70 78 | 
             
                }
         | 
| 71 79 | 
             
                return new UserFromToken(
         | 
| 72 80 | 
             
                  obj.userId,
         | 
| @@ -80,6 +88,29 @@ var UserFromToken = class { | |
| 80 88 | 
             
                  obj.properties
         | 
| 81 89 | 
             
                );
         | 
| 82 90 | 
             
              }
         | 
| 91 | 
            +
              static fromJwtPayload(payload) {
         | 
| 92 | 
            +
                let activeOrgId;
         | 
| 93 | 
            +
                let orgIdToOrgMemberInfo;
         | 
| 94 | 
            +
                if (payload.org_member_info) {
         | 
| 95 | 
            +
                  activeOrgId = payload.org_member_info.org_id;
         | 
| 96 | 
            +
                  orgIdToOrgMemberInfo = toOrgIdToOrgMemberInfo({ [activeOrgId]: payload.org_member_info });
         | 
| 97 | 
            +
                } else {
         | 
| 98 | 
            +
                  activeOrgId = void 0;
         | 
| 99 | 
            +
                  orgIdToOrgMemberInfo = toOrgIdToOrgMemberInfo(payload.org_id_to_org_member_info);
         | 
| 100 | 
            +
                }
         | 
| 101 | 
            +
                return new UserFromToken(
         | 
| 102 | 
            +
                  payload.user_id,
         | 
| 103 | 
            +
                  payload.email,
         | 
| 104 | 
            +
                  orgIdToOrgMemberInfo,
         | 
| 105 | 
            +
                  payload.first_name,
         | 
| 106 | 
            +
                  payload.last_name,
         | 
| 107 | 
            +
                  payload.username,
         | 
| 108 | 
            +
                  payload.legacy_user_id,
         | 
| 109 | 
            +
                  payload.impersonatorUserId,
         | 
| 110 | 
            +
                  payload.properties,
         | 
| 111 | 
            +
                  activeOrgId
         | 
| 112 | 
            +
                );
         | 
| 113 | 
            +
              }
         | 
| 83 114 | 
             
            };
         | 
| 84 115 | 
             
            var OrgMemberInfo = class {
         | 
| 85 116 | 
             
              constructor(orgId, orgName, orgMetadata, urlSafeOrgName, userAssignedRole, userInheritedRolesPlusCurrentRole, userPermissions) {
         | 
| @@ -128,17 +159,7 @@ var OrgMemberInfo = class { | |
| 128 159 | 
             
              }
         | 
| 129 160 | 
             
            };
         | 
| 130 161 | 
             
            function toUser(snake_case) {
         | 
| 131 | 
            -
              return  | 
| 132 | 
            -
                snake_case.user_id,
         | 
| 133 | 
            -
                snake_case.email,
         | 
| 134 | 
            -
                toOrgIdToOrgMemberInfo(snake_case.org_id_to_org_member_info),
         | 
| 135 | 
            -
                snake_case.first_name,
         | 
| 136 | 
            -
                snake_case.last_name,
         | 
| 137 | 
            -
                snake_case.username,
         | 
| 138 | 
            -
                snake_case.legacy_user_id,
         | 
| 139 | 
            -
                snake_case.impersonatorUserId,
         | 
| 140 | 
            -
                snake_case.properties
         | 
| 141 | 
            -
              );
         | 
| 162 | 
            +
              return UserFromToken.fromJwtPayload(snake_case);
         | 
| 142 163 | 
             
            }
         | 
| 143 164 | 
             
            function toOrgIdToOrgMemberInfo(snake_case) {
         | 
| 144 165 | 
             
              if (snake_case === void 0) {
         | 
| @@ -206,12 +227,17 @@ function getVerifierKey() { | |
| 206 227 | 
             
              }
         | 
| 207 228 | 
             
              return verifierKey.replace(/\\n/g, "\n");
         | 
| 208 229 | 
             
            }
         | 
| 209 | 
            -
            function refreshTokenWithAccessAndRefreshToken(refreshToken) {
         | 
| 230 | 
            +
            function refreshTokenWithAccessAndRefreshToken(refreshToken, activeOrgId) {
         | 
| 210 231 | 
             
              return __async(this, null, function* () {
         | 
| 211 232 | 
             
                const body = {
         | 
| 212 233 | 
             
                  refresh_token: refreshToken
         | 
| 213 234 | 
             
                };
         | 
| 214 | 
            -
                const  | 
| 235 | 
            +
                const queryParams = new URLSearchParams();
         | 
| 236 | 
            +
                if (activeOrgId) {
         | 
| 237 | 
            +
                  queryParams.set("with_active_org_support", "true");
         | 
| 238 | 
            +
                  queryParams.set("active_org_id", activeOrgId);
         | 
| 239 | 
            +
                }
         | 
| 240 | 
            +
                const url = `${getAuthUrlOrigin()}/api/backend/v1/refresh_token?${queryParams.toString()}`;
         | 
| 215 241 | 
             
                const response = yield fetch(url, {
         | 
| 216 242 | 
             
                  method: "POST",
         | 
| 217 243 | 
             
                  body: JSON.stringify(body),
         | 
| @@ -223,10 +249,7 @@ function refreshTokenWithAccessAndRefreshToken(refreshToken) { | |
| 223 249 | 
             
                if (response.ok) {
         | 
| 224 250 | 
             
                  const data = yield response.json();
         | 
| 225 251 | 
             
                  const newRefreshToken = data.refresh_token;
         | 
| 226 | 
            -
                  const {
         | 
| 227 | 
            -
                    access_token: accessToken,
         | 
| 228 | 
            -
                    expires_at_seconds: expiresAtSeconds
         | 
| 229 | 
            -
                  } = data.access_token;
         | 
| 252 | 
            +
                  const { access_token: accessToken, expires_at_seconds: expiresAtSeconds } = data.access_token;
         | 
| 230 253 | 
             
                  return {
         | 
| 231 254 | 
             
                    refreshToken: newRefreshToken,
         | 
| 232 255 | 
             
                    accessToken,
         | 
| @@ -287,11 +310,15 @@ function validateAccessToken(accessToken) { | |
| 287 310 | 
             
              });
         | 
| 288 311 | 
             
            }
         | 
| 289 312 |  | 
| 313 | 
            +
            // src/shared.ts
         | 
| 314 | 
            +
            var ACTIVE_ORG_ID_COOKIE_NAME = "__pa_org_id";
         | 
| 315 | 
            +
             | 
| 290 316 | 
             
            // src/server/pages.ts
         | 
| 291 317 | 
             
            function getUserFromServerSideProps(props, forceRefresh = false) {
         | 
| 292 318 | 
             
              return __async(this, null, function* () {
         | 
| 293 319 | 
             
                const accessToken = props.req.cookies[ACCESS_TOKEN_COOKIE_NAME];
         | 
| 294 320 | 
             
                const refreshToken = props.req.cookies[REFRESH_TOKEN_COOKIE_NAME];
         | 
| 321 | 
            +
                const activeOrgId = props.req.cookies[ACTIVE_ORG_ID_COOKIE_NAME];
         | 
| 295 322 | 
             
                if (accessToken && !forceRefresh) {
         | 
| 296 323 | 
             
                  const user = yield validateAccessTokenOrUndefined(accessToken);
         | 
| 297 324 | 
             
                  if (user) {
         | 
| @@ -299,7 +326,7 @@ function getUserFromServerSideProps(props, forceRefresh = false) { | |
| 299 326 | 
             
                  }
         | 
| 300 327 | 
             
                }
         | 
| 301 328 | 
             
                if (refreshToken) {
         | 
| 302 | 
            -
                  const response = yield refreshTokenWithAccessAndRefreshToken(refreshToken);
         | 
| 329 | 
            +
                  const response = yield refreshTokenWithAccessAndRefreshToken(refreshToken, activeOrgId);
         | 
| 303 330 | 
             
                  if (response.error === "unexpected") {
         | 
| 304 331 | 
             
                    throw new Error("Unexpected error while refreshing access token");
         | 
| 305 332 | 
             
                  } else if (response.error === "unauthorized") {
         | 
| @@ -324,6 +351,7 @@ function getUserFromApiRouteRequest(req, res) { | |
| 324 351 | 
             
              return __async(this, null, function* () {
         | 
| 325 352 | 
             
                const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME];
         | 
| 326 353 | 
             
                const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME];
         | 
| 354 | 
            +
                const activeOrgId = req.cookies[ACTIVE_ORG_ID_COOKIE_NAME];
         | 
| 327 355 | 
             
                if (accessToken) {
         | 
| 328 356 | 
             
                  const user = yield validateAccessTokenOrUndefined(accessToken);
         | 
| 329 357 | 
             
                  if (user) {
         | 
| @@ -331,7 +359,7 @@ function getUserFromApiRouteRequest(req, res) { | |
| 331 359 | 
             
                  }
         | 
| 332 360 | 
             
                }
         | 
| 333 361 | 
             
                if (refreshToken) {
         | 
| 334 | 
            -
                  const response = yield refreshTokenWithAccessAndRefreshToken(refreshToken);
         | 
| 362 | 
            +
                  const response = yield refreshTokenWithAccessAndRefreshToken(refreshToken, activeOrgId);
         | 
| 335 363 | 
             
                  if (response.error === "unexpected") {
         | 
| 336 364 | 
             
                    throw new Error("Unexpected error while refreshing access token");
         | 
| 337 365 | 
             
                  } else if (response.error === "unauthorized") {
         |