diff --git a/package-lock.json b/package-lock.json index 3cbbd321d7d..36574a2d60e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22887,10 +22887,10 @@ }, "packages/backend-core": { "name": "@clerk/backend-core", - "version": "0.7.0-alpha.1", + "version": "0.8.0-alpha.1", "license": "MIT", "dependencies": { - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "camelcase-keys": "^7.0.1", "query-string": "^7.0.1", "snakecase-keys": "^5.1.2", @@ -22917,10 +22917,10 @@ }, "packages/clerk-js": { "name": "@clerk/clerk-js", - "version": "3.0.1-alpha.3", + "version": "3.1.0-alpha.0", "license": "MIT", "dependencies": { - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "@popperjs/core": "^2.4.4", "browser-tabs-lock": "^1.2.15", "classnames": "^2.3.1", @@ -22940,7 +22940,7 @@ "@babel/preset-env": "^7.12.1", "@babel/preset-react": "^7.12.5", "@babel/preset-typescript": "^7.12.1", - "@clerk/shared": "^0.0.16-alpha.3", + "@clerk/shared": "^0.0.16-alpha.4", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.2", "@svgr/webpack": "^6.2.1", "@testing-library/dom": "^7.28.1", @@ -23023,10 +23023,10 @@ }, "packages/edge": { "name": "@clerk/edge", - "version": "1.1.0-alpha.1", + "version": "1.2.0-alpha.1", "license": "MIT", "dependencies": { - "@clerk/backend-core": "^0.7.0-alpha.1", + "@clerk/backend-core": "^0.8.0-alpha.1", "@peculiar/webcrypto": "^1.2.3", "next": "^12.0.7" }, @@ -23049,15 +23049,15 @@ }, "packages/expo": { "name": "@clerk/clerk-expo", - "version": "0.8.18-alpha.3", + "version": "0.9.0-alpha.1", "license": "MIT", "dependencies": { - "@clerk/clerk-js": "^3.0.1-alpha.3", - "@clerk/clerk-react": "^3.0.1-alpha.3", + "@clerk/clerk-js": "^3.1.0-alpha.0", + "@clerk/clerk-react": "^3.1.0-alpha.1", "base-64": "^1.0.0" }, "devDependencies": { - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "@types/jest": "^27.4.0", "@types/node": "^16.11.9", "@types/react": "^17.0.39", @@ -23084,13 +23084,13 @@ }, "packages/nextjs": { "name": "@clerk/nextjs", - "version": "3.1.0-alpha.1", + "version": "3.2.0-alpha.1", "license": "MIT", "dependencies": { - "@clerk/clerk-react": "^3.0.1-alpha.3", - "@clerk/clerk-sdk-node": "^3.1.0-alpha.1", - "@clerk/edge": "^1.1.0-alpha.1", - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/clerk-react": "^3.1.0-alpha.1", + "@clerk/clerk-sdk-node": "^3.2.0-alpha.1", + "@clerk/edge": "^1.2.0-alpha.1", + "@clerk/types": "^2.1.0-alpha.0", "tslib": "^2.3.1" }, "devDependencies": { @@ -23120,10 +23120,10 @@ }, "packages/react": { "name": "@clerk/clerk-react", - "version": "3.0.1-alpha.3", + "version": "3.1.0-alpha.1", "license": "MIT", "dependencies": { - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "tslib": "^2.3.1" }, "devDependencies": { @@ -23160,12 +23160,12 @@ }, "packages/remix": { "name": "@clerk/remix", - "version": "0.2.0-alpha.1", + "version": "0.3.0-alpha.1", "license": "MIT", "dependencies": { - "@clerk/clerk-react": "^3.0.1-alpha.3", - "@clerk/clerk-sdk-node": "^3.1.0-alpha.1", - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/clerk-react": "^3.1.0-alpha.1", + "@clerk/clerk-sdk-node": "^3.2.0-alpha.1", + "@clerk/types": "^2.1.0-alpha.0", "cookie": "^0.4.2", "tslib": "^2.3.1" }, @@ -23206,10 +23206,10 @@ }, "packages/sdk-node": { "name": "@clerk/clerk-sdk-node", - "version": "3.1.0-alpha.1", + "version": "3.2.0-alpha.1", "license": "MIT", "dependencies": { - "@clerk/backend-core": "^0.7.0-alpha.1", + "@clerk/backend-core": "^0.8.0-alpha.1", "@peculiar/webcrypto": "^1.2.3", "camelcase-keys": "^6.2.2", "cookies": "^0.8.0", @@ -23282,12 +23282,12 @@ }, "packages/shared": { "name": "@clerk/shared", - "version": "0.0.16-alpha.3", + "version": "0.0.16-alpha.4", "devDependencies": { "@babel/core": "^7.13.14", "@babel/preset-env": "^7.13.12", "@babel/preset-react": "^7.13.13", - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "@popperjs/core": "^2.5.4", "@sentry/browser": "^6.3.0", "@svgr/webpack": "^6.2.1", @@ -23341,7 +23341,7 @@ }, "packages/types": { "name": "@clerk/types", - "version": "2.0.1-alpha.3", + "version": "2.1.0-alpha.0", "license": "MIT", "devDependencies": { "@types/jest": "^27.4.0", @@ -24643,7 +24643,7 @@ "@clerk/backend-core": { "version": "file:packages/backend-core", "requires": { - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "@peculiar/webcrypto": "^1.3.2", "@types/jest": "^27.4.0", "@types/node": "^16.11.12", @@ -24671,9 +24671,9 @@ "@clerk/clerk-expo": { "version": "file:packages/expo", "requires": { - "@clerk/clerk-js": "^3.0.1-alpha.3", - "@clerk/clerk-react": "^3.0.1-alpha.3", - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/clerk-js": "^3.1.0-alpha.0", + "@clerk/clerk-react": "^3.1.0-alpha.1", + "@clerk/types": "^2.1.0-alpha.0", "@types/jest": "^27.4.0", "@types/node": "^16.11.9", "@types/react": "^17.0.39", @@ -24704,8 +24704,8 @@ "@babel/preset-env": "^7.12.1", "@babel/preset-react": "^7.12.5", "@babel/preset-typescript": "^7.12.1", - "@clerk/shared": "^0.0.16-alpha.3", - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/shared": "^0.0.16-alpha.4", + "@clerk/types": "^2.1.0-alpha.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.2", "@popperjs/core": "^2.4.4", "@svgr/webpack": "^6.2.1", @@ -24789,7 +24789,7 @@ "@clerk/clerk-react": { "version": "file:packages/react", "requires": { - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "@testing-library/dom": "^7.28.1", "@testing-library/jest-dom": "^5.11.6", "@testing-library/react": "^11.2.1", @@ -24821,7 +24821,7 @@ "@clerk/clerk-sdk-node": { "version": "file:packages/sdk-node", "requires": { - "@clerk/backend-core": "^0.7.0-alpha.1", + "@clerk/backend-core": "^0.8.0-alpha.1", "@peculiar/webcrypto": "^1.2.3", "@types/cookies": "^0.7.7", "@types/express": "^4.17.11", @@ -24877,7 +24877,7 @@ "@clerk/edge": { "version": "file:packages/edge", "requires": { - "@clerk/backend-core": "^0.7.0-alpha.1", + "@clerk/backend-core": "^0.8.0-alpha.1", "@peculiar/webcrypto": "^1.2.3", "@types/jest": "^27.4.0", "@types/node": "^16.11.12", @@ -24898,10 +24898,10 @@ "@clerk/nextjs": { "version": "file:packages/nextjs", "requires": { - "@clerk/clerk-react": "^3.0.1-alpha.3", - "@clerk/clerk-sdk-node": "^3.1.0-alpha.1", - "@clerk/edge": "^1.1.0-alpha.1", - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/clerk-react": "^3.1.0-alpha.1", + "@clerk/clerk-sdk-node": "^3.2.0-alpha.1", + "@clerk/edge": "^1.2.0-alpha.1", + "@clerk/types": "^2.1.0-alpha.0", "@types/jest": "^27.4.0", "@types/node": "^16.11.9", "@types/react": "^17.0.39", @@ -24926,9 +24926,9 @@ "@clerk/remix": { "version": "file:packages/remix", "requires": { - "@clerk/clerk-react": "^3.0.1-alpha.3", - "@clerk/clerk-sdk-node": "^3.1.0-alpha.1", - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/clerk-react": "^3.1.0-alpha.1", + "@clerk/clerk-sdk-node": "^3.2.0-alpha.1", + "@clerk/types": "^2.1.0-alpha.0", "@types/cookie": "^0.4.1", "@types/jest": "^27.4.0", "@types/node": "^16.11.9", @@ -24962,7 +24962,7 @@ "@babel/core": "^7.13.14", "@babel/preset-env": "^7.13.12", "@babel/preset-react": "^7.13.13", - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "@popperjs/core": "^2.5.4", "@sentry/browser": "^6.3.0", "@svgr/webpack": "^6.2.1", diff --git a/packages/backend-core/CHANGELOG.md b/packages/backend-core/CHANGELOG.md index ddfd66b8366..3e2f179d1b5 100644 --- a/packages/backend-core/CHANGELOG.md +++ b/packages/backend-core/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.8.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/backend-core@0.7.0-alpha.1...@clerk/backend-core@0.8.0-alpha.1) (2022-03-23) + +### Features + +- **backend-core,clerk-sdk-node,nextjs,remix:** Add injected jwtKey option ([53e56e7](https://github.com/clerkinc/javascript/commit/53e56e76d59984d4d3f5b7e1e2d276adb8b2dc77)) +- **backend-core:** Add capability for injected JWT key on getAuthState and verifySessionToken ([8b318cc](https://github.com/clerkinc/javascript/commit/8b318cc8cf6f4730c92239d5f9da4d72177449d5)) + +## [0.8.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/backend-core@0.7.0-alpha.1...@clerk/backend-core@0.8.0-alpha.0) (2022-03-22) + +**Note:** Version bump only for package @clerk/backend-core + ## [0.7.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/backend-core@0.7.0-alpha.0...@clerk/backend-core@0.7.0-alpha.1) (2022-03-22) ### Bug Fixes diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 0e668b3ab36..7b361bd001a 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend-core", - "version": "0.7.0-alpha.1", + "version": "0.8.0-alpha.1", "license": "MIT", "description": "Clerk Backend API core resources and authentication utilities for JavaScript environments.", "scripts": { @@ -12,7 +12,7 @@ "main": "dist/cjs/index.js", "module": "dist/mjs/index.js", "dependencies": { - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "camelcase-keys": "^7.0.1", "query-string": "^7.0.1", "snakecase-keys": "^5.1.2", diff --git a/packages/backend-core/src/Base.ts b/packages/backend-core/src/Base.ts index 2c25c37e3ac..7323e448d4c 100644 --- a/packages/backend-core/src/Base.ts +++ b/packages/backend-core/src/Base.ts @@ -27,10 +27,7 @@ export type Session = { export type VerifySessionTokenOptions = { authorizedParties?: string[]; -}; - -const verifySessionTokenDefaultOptions: VerifySessionTokenOptions = { - authorizedParties: [], + jwtKey?: string; }; type AuthState = { @@ -65,6 +62,8 @@ type AuthStateParams = { authorizedParties?: string[]; /* HTTP utility for fetching a text/html string */ fetchInterstitial: () => Promise<string>; + /* Value corresponding to the JWT verification key */ + jwtKey?: string; }; export class Base { @@ -105,14 +104,18 @@ export class Base { */ verifySessionToken = async ( token: string, - { authorizedParties }: VerifySessionTokenOptions = verifySessionTokenDefaultOptions, + { authorizedParties, jwtKey }: VerifySessionTokenOptions, ): Promise<JWTPayload> => { - // Try to load the PK from supplied function and - // if there is no custom load function - // try to load from the environment. - const availableKey = this.loadCryptoKeyFunction - ? await this.loadCryptoKeyFunction(token) - : await this.loadCryptoKeyFromEnv(); + /** + * Priority of JWT key search + * 1. Use supplied key + * 2. Use load function + * 3. Try to load from env + */ + const availableKey = + !jwtKey && this.loadCryptoKeyFunction + ? await this.loadCryptoKeyFunction(token) + : await this.loadCryptoKey(jwtKey || process.env.CLERK_JWT_KEY); const claims = await this.verifyJwt(availableKey, token); checkClaims(claims, authorizedParties); @@ -121,13 +124,12 @@ export class Base { /** * - * Modify the RSA public key from the PEM retrieved from the CLERK_JWT_KEY environment variable - * and return a contructed CryptoKey. + * @param {string} token Clerk JWT verification token + * Modify the RSA public key from the Clerk PEM supplied and return a contructed CryptoKey. * You will find that at your application dashboard (https://dashboard.clerk.dev) under Settings -> API keys * */ - loadCryptoKeyFromEnv = async (): Promise<CryptoKey> => { - const key = process.env.CLERK_JWT_KEY; + loadCryptoKey = async (key?: string): Promise<CryptoKey> => { if (!key) { throw new Error('Missing jwt key'); } @@ -219,18 +221,20 @@ export class Base { userAgent, authorizedParties, fetchInterstitial, + jwtKey, }: AuthStateParams): Promise<AuthState> => { let sessionClaims; if (headerToken) { try { sessionClaims = await this.verifySessionToken(headerToken, { authorizedParties, + jwtKey, }); return { status: AuthStatus.SignedIn, session: { - id: sessionClaims.sid as string, - userId: sessionClaims.sub as string, + id: sessionClaims.sid, + userId: sessionClaims.sub, }, sessionClaims, }; @@ -322,6 +326,7 @@ export class Base { try { sessionClaims = await this.verifySessionToken(cookieToken as string, { authorizedParties, + jwtKey, }); } catch (err) { if (err instanceof JWTExpiredError) { @@ -334,12 +339,12 @@ export class Base { } } - if (cookieToken && clientUat && sessionClaims?.iat && sessionClaims.iat >= Number(clientUat)) { + if (cookieToken && clientUat && sessionClaims.iat >= Number(clientUat)) { return { status: AuthStatus.SignedIn, session: { - id: sessionClaims.sid as string, - userId: sessionClaims.sub as string, + id: sessionClaims.sid, + userId: sessionClaims.sub, }, sessionClaims, }; diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index 8206b6d56de..2bff3a60d9b 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.1.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/clerk-js@3.0.1-alpha.3...@clerk/clerk-js@3.1.0-alpha.0) (2022-03-23) + +### Features + +- **clerk-js,types:** Rename UserButton params to afterSignOutUrl, afterMultiSessionSingleSignOutUrl ([c4cb76a](https://github.com/clerkinc/javascript/commit/c4cb76a1133fd2308b217cacaffb086b175f6347)) + +### Bug Fixes + +- **clerk-js:** Stop parsing deprecated params from query strings ([8280d96](https://github.com/clerkinc/javascript/commit/8280d96f3cc99290687a551627c675e2b6a1edf0)) + ### [3.0.1-alpha.3](https://github.com/clerkinc/javascript/compare/@clerk/clerk-js@3.0.1-alpha.2...@clerk/clerk-js@3.0.1-alpha.3) (2022-03-22) ### Bug Fixes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 8b21112a451..b87bdd9d30c 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "3.0.1-alpha.3", + "version": "3.1.0-alpha.0", "license": "MIT", "description": "Clerk.dev JS library", "keywords": [ @@ -38,7 +38,7 @@ "test:coverage": "jest --collectCoverage" }, "dependencies": { - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "@popperjs/core": "^2.4.4", "browser-tabs-lock": "^1.2.15", "classnames": "^2.3.1", @@ -58,7 +58,7 @@ "@babel/preset-env": "^7.12.1", "@babel/preset-react": "^7.12.5", "@babel/preset-typescript": "^7.12.1", - "@clerk/shared": "^0.0.16-alpha.3", + "@clerk/shared": "^0.0.16-alpha.4", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.2", "@svgr/webpack": "^6.2.1", "@testing-library/dom": "^7.28.1", diff --git a/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.test.tsx b/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.test.tsx index c355c85ffc6..1b635d89e86 100644 --- a/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.test.tsx +++ b/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.test.tsx @@ -83,7 +83,7 @@ describe('ActiveAccountsManager', () => { const tree = renderJSON( <ActiveAccountsManager sessions={sessions} - navigateAfterSignOutAll={noop} + navigateAfterSignOut={noop} navigateAfterSwitchSession={noop} userProfileUrl={'user_profile_url'} signInUrl={'sign_in_url'} @@ -99,7 +99,7 @@ describe('ActiveAccountsManager', () => { <ActiveAccountsManager showActiveAccountButtons={false} sessions={[session]} - navigateAfterSignOutAll={noop} + navigateAfterSignOut={noop} navigateAfterSwitchSession={noop} userProfileUrl={'user_profile_url'} signInUrl={'sign_in_url'} @@ -115,7 +115,7 @@ describe('ActiveAccountsManager', () => { <ActiveAccountsManager showActiveAccountButtons={false} sessions={[session]} - navigateAfterSignOutAll={noop} + navigateAfterSignOut={noop} navigateAfterSwitchSession={noop} userProfileUrl={'user_profile_url'} signInUrl={'sign_in_url'} diff --git a/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.tsx b/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.tsx index 12c67adc582..494c9abcb14 100644 --- a/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.tsx +++ b/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.tsx @@ -12,9 +12,9 @@ import SignOutAll from './SignOutAll'; interface ActiveAccountsManagerProps { sessions: SessionResource[]; - navigateAfterSignOutAll: () => void; + navigateAfterSignOut: () => void; navigateAfterSwitchSession: () => void; - navigateAfterSignOutOne?: () => void; + navigateAfterMultiSessionSingleSignOut?: () => void; userProfileUrl: string; signInUrl: string; showActiveAccountButtons?: boolean; @@ -22,8 +22,8 @@ interface ActiveAccountsManagerProps { export function ActiveAccountsManager({ sessions, - navigateAfterSignOutAll, - navigateAfterSignOutOne, + navigateAfterSignOut, + navigateAfterMultiSessionSingleSignOut, navigateAfterSwitchSession, signInUrl, userProfileUrl, @@ -46,7 +46,9 @@ export function ActiveAccountsManager({ return; } - signOut(navigateAfterSignOutOne, { sessionId: currentSessionId }).catch(() => setSignoutInProgress(false)); + signOut(navigateAfterMultiSessionSingleSignOut, { sessionId: currentSessionId }).catch(() => + setSignoutInProgress(false), + ); }; const handleManageAccountClick = () => { @@ -71,7 +73,7 @@ export function ActiveAccountsManager({ }; const handleSignOutAll = () => { - return signOut(navigateAfterSignOutAll); + return signOut(navigateAfterSignOut); }; const shouldRenderAccountSwitcher = sessions.length || !authConfig.singleSessionMode; diff --git a/packages/clerk-js/src/ui/common/authPropHelpers.ts b/packages/clerk-js/src/ui/common/authPropHelpers.ts index ee41c313065..6850c0115e4 100644 --- a/packages/clerk-js/src/ui/common/authPropHelpers.ts +++ b/packages/clerk-js/src/ui/common/authPropHelpers.ts @@ -20,21 +20,12 @@ type ParseAuthPropArgs = export const parseAuthProp = ({ ctx, queryParams, displayConfig, field }: ParseAuthPropArgs): string => { const snakeCaseField = camelToSnake(field); - - // Todo: Dx: Deprecate afterSignIn and afterSignUp legacy fields - const legacyField = field.replace('Url', ''); - let legacyFieldValue: string | undefined = undefined; - if (legacyField in ctx) { - // @ts-ignore - legacyFieldValue = ctx[legacyField]; - } const queryParamValue = queryParams[snakeCaseField]; return ( (typeof queryParamValue === 'string' ? queryParamValue : null) || (typeof queryParams.redirect_url === 'string' ? queryParams.redirect_url : null) || ctx[field] || - legacyFieldValue || ctx.redirectUrl || displayConfig[field] ); diff --git a/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx b/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx index ddfb50996ec..0813c980d23 100644 --- a/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx +++ b/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx @@ -169,24 +169,24 @@ export const useUserButtonContext = () => { const signInUrl = ctx.signInUrl || displayConfig.signInUrl; const userProfileUrl = ctx.userProfileUrl || displayConfig.userProfileUrl; - const afterSignOutOneUrl = ctx.afterSignOutOneUrl || displayConfig.afterSignOutOneUrl; - const navigateAfterSignOutOne = () => navigate(afterSignOutOneUrl); + const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl; + const navigateAfterMultiSessionSingleSignOut = () => navigate(afterMultiSessionSingleSignOutUrl); - const afterSignOutAllUrl = ctx.afterSignOutAllUrl || displayConfig.afterSignOutAllUrl; - const navigateAfterSignOutAll = () => navigate(afterSignOutAllUrl); + const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl; + const navigateAfterSignOut = () => navigate(afterSignOutUrl); const afterSwitchSessionUrl = (ctx.afterSwitchSessionUrl = displayConfig.afterSwitchSessionUrl); const navigateAfterSwitchSession = () => navigate(afterSwitchSessionUrl); return { ...ctx, - navigateAfterSignOutOne, - navigateAfterSignOutAll, + navigateAfterMultiSessionSingleSignOut, + navigateAfterSignOut, navigateAfterSwitchSession, signInUrl, userProfileUrl, - afterSignOutOneUrl, - afterSignOutAllUrl, + afterMultiSessionSingleSignOutUrl, + afterSignOutUrl, afterSwitchSessionUrl, }; }; diff --git a/packages/clerk-js/src/ui/signIn/SignInAccountSwitcher.tsx b/packages/clerk-js/src/ui/signIn/SignInAccountSwitcher.tsx index a2bb59522d0..a4271ab18ae 100644 --- a/packages/clerk-js/src/ui/signIn/SignInAccountSwitcher.tsx +++ b/packages/clerk-js/src/ui/signIn/SignInAccountSwitcher.tsx @@ -19,7 +19,7 @@ function _SignInAccountSwitcher(): JSX.Element | null { <ActiveAccountsManager sessions={sessions} showActiveAccountButtons={false} - navigateAfterSignOutAll={() => { + navigateAfterSignOut={() => { navigate(displayConfig.afterSignOutAllUrl); }} navigateAfterSwitchSession={navigateAfterSignIn} diff --git a/packages/clerk-js/src/ui/userButton/UserButton.test.tsx b/packages/clerk-js/src/ui/userButton/UserButton.test.tsx index 7728dc07a3f..0b20f907761 100644 --- a/packages/clerk-js/src/ui/userButton/UserButton.test.tsx +++ b/packages/clerk-js/src/ui/userButton/UserButton.test.tsx @@ -52,8 +52,8 @@ jest.mock('ui/contexts', () => { useUserButtonContext: () => { return { useUserButtonContext: jest.fn(() => ({ - navigateAfterSignOutOne: jest.fn(), - navigateAfterSignOutAll: jest.fn(), + navigateAfterMultiSessionSingleSignOut: jest.fn(), + navigateAfterSignOut: jest.fn(), navigateAfterSwitchSession: jest.fn(), userProfileURL: 'http://test.host/profile', signInUrl: 'http://test.host/signin', diff --git a/packages/clerk-js/src/ui/userButton/UserButtonPopup.test.tsx b/packages/clerk-js/src/ui/userButton/UserButtonPopup.test.tsx index 68326d26376..b545bac7927 100644 --- a/packages/clerk-js/src/ui/userButton/UserButtonPopup.test.tsx +++ b/packages/clerk-js/src/ui/userButton/UserButtonPopup.test.tsx @@ -69,8 +69,8 @@ jest.mock('ui/contexts', () => { }, })), useUserButtonContext: jest.fn(() => ({ - navigateAfterSignOutOne: jest.fn(), - navigateAfterSignOutAll: jest.fn(), + navigateAfterMultiSessionSingleSignOut: jest.fn(), + navigateAfterSignOut: jest.fn(), navigateAfterSwitchSession: jest.fn(), userProfileURL: 'http://test.host/profile', signInUrl: 'http://test.host/signin', diff --git a/packages/edge/CHANGELOG.md b/packages/edge/CHANGELOG.md index 95455ab6457..dbb33b33700 100644 --- a/packages/edge/CHANGELOG.md +++ b/packages/edge/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.2.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/edge@1.1.0-alpha.1...@clerk/edge@1.2.0-alpha.1) (2022-03-23) + +### Features + +- **backend-core,clerk-sdk-node,nextjs,remix:** Add injected jwtKey option ([53e56e7](https://github.com/clerkinc/javascript/commit/53e56e76d59984d4d3f5b7e1e2d276adb8b2dc77)) + +## [1.2.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/edge@1.1.0-alpha.1...@clerk/edge@1.2.0-alpha.0) (2022-03-22) + +**Note:** Version bump only for package @clerk/edge + ## [1.1.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/edge@1.1.0-alpha.0...@clerk/edge@1.1.0-alpha.1) (2022-03-22) **Note:** Version bump only for package @clerk/edge diff --git a/packages/edge/package.json b/packages/edge/package.json index d75c7a1e1af..ae7486cf4e0 100644 --- a/packages/edge/package.json +++ b/packages/edge/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/edge", - "version": "1.1.0-alpha.1", + "version": "1.2.0-alpha.1", "license": "MIT", "description": "Clerk SDK for serverless and edge environments", "keywords": [ @@ -36,7 +36,7 @@ "build": "node ./scripts/info.cjs && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && ./moduleTypeFix" }, "dependencies": { - "@clerk/backend-core": "^0.7.0-alpha.1", + "@clerk/backend-core": "^0.8.0-alpha.1", "@peculiar/webcrypto": "^1.2.3", "next": "^12.0.7" }, diff --git a/packages/edge/scripts/info.cjs b/packages/edge/scripts/info.cjs index 3baf5ea4f50..b09d04d8cb2 100644 --- a/packages/edge/scripts/info.cjs +++ b/packages/edge/scripts/info.cjs @@ -4,10 +4,9 @@ const path = require('path'); fs.writeFileSync( path.resolve(__dirname, '../src/info.ts'), - ` -/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */ -export const LIB_VERSION="${packageJson.version}"; -export const LIB_NAME="${packageJson.name}"; + `/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */ +export const LIB_VERSION = '${packageJson.version}'; +export const LIB_NAME = '${packageJson.name}'; `, { encoding: 'utf-8' }, ); diff --git a/packages/edge/src/info.ts b/packages/edge/src/info.ts index e71bf3761ee..8dd96d8db22 100644 --- a/packages/edge/src/info.ts +++ b/packages/edge/src/info.ts @@ -1,3 +1,3 @@ /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */ -export const LIB_VERSION = '1.1.0-alpha.1'; +export const LIB_VERSION = '1.2.0-alpha.1'; export const LIB_NAME = '@clerk/edge'; diff --git a/packages/edge/src/vercel-edge/index.ts b/packages/edge/src/vercel-edge/index.ts index e1796a9fc86..48326a12299 100644 --- a/packages/edge/src/vercel-edge/index.ts +++ b/packages/edge/src/vercel-edge/index.ts @@ -68,12 +68,12 @@ export function withEdgeMiddlewareAuth< export function withEdgeMiddlewareAuth( handler: any, options: any = { - authorizedParties: [], loadSession: false, loadUser: false, }, ): any { return async function clerkAuth(req: NextRequest, event: NextFetchEvent) { + const { loadUser, loadSession, jwtKey, authorizedParties } = options; const cookieToken = req.cookies['__session']; const headerToken = req.headers.get('authorization'); const { status, interstitial, sessionClaims } = await vercelEdgeBase.getAuthState({ @@ -86,7 +86,8 @@ export function withEdgeMiddlewareAuth( forwardedPort: req.headers.get('x-forwarded-port'), forwardedHost: req.headers.get('x-forwarded-host'), referrer: req.headers.get('referrer'), - authorizedParties: options.authorizedParties, + authorizedParties, + jwtKey, fetchInterstitial, }); @@ -106,8 +107,8 @@ export function withEdgeMiddlewareAuth( const userId = sessionClaims!.sub; const [user, session] = await Promise.all([ - options.loadUser ? ClerkAPI.users.getUser(userId) : Promise.resolve(undefined), - options.loadSession ? ClerkAPI.sessions.getSession(sessionId) : Promise.resolve(undefined), + loadUser ? ClerkAPI.users.getUser(userId) : Promise.resolve(undefined), + loadSession ? ClerkAPI.sessions.getSession(sessionId) : Promise.resolve(undefined), ]); const getToken = createGetToken({ diff --git a/packages/edge/src/vercel-edge/types.ts b/packages/edge/src/vercel-edge/types.ts index 793b936a631..4446dd5c66e 100644 --- a/packages/edge/src/vercel-edge/types.ts +++ b/packages/edge/src/vercel-edge/types.ts @@ -6,6 +6,7 @@ export type WithEdgeMiddlewareAuthOptions = { loadUser?: boolean; loadSession?: boolean; authorizedParties?: string[]; + jwtKey?: string; }; export type WithEdgeMiddlewareAuthCallback<Return, Options> = ( diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index 4373c21c73d..242a50819a9 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.9.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-expo@0.8.18-alpha.3...@clerk/clerk-expo@0.9.0-alpha.1) (2022-03-23) + +### Bug Fixes + +- **clerk-expo:** Make Clerk loading smarter ([#136](https://github.com/clerkinc/javascript/issues/136)) ([2405d81](https://github.com/clerkinc/javascript/commit/2405d813b41c1f3c345c894c18e65710891bd710)) + +## [0.9.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/clerk-expo@0.8.18-alpha.3...@clerk/clerk-expo@0.9.0-alpha.0) (2022-03-22) + +**Note:** Version bump only for package @clerk/clerk-expo + ### [0.8.18-alpha.3](https://github.com/clerkinc/javascript/compare/@clerk/clerk-expo@0.8.18-alpha.2...@clerk/clerk-expo@0.8.18-alpha.3) (2022-03-22) **Note:** Version bump only for package @clerk/clerk-expo diff --git a/packages/expo/package.json b/packages/expo/package.json index d39e9d871ee..04ee526cbaf 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "0.8.18-alpha.3", + "version": "0.9.0-alpha.1", "license": "MIT", "description": "Clerk.dev React Native/Expo library", "keywords": [ @@ -26,12 +26,12 @@ "dev": "tsc -p tsconfig.build.json --watch" }, "dependencies": { - "@clerk/clerk-js": "^3.0.1-alpha.3", - "@clerk/clerk-react": "^3.0.1-alpha.3", + "@clerk/clerk-js": "^3.1.0-alpha.0", + "@clerk/clerk-react": "^3.1.0-alpha.1", "base-64": "^1.0.0" }, "devDependencies": { - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "@types/jest": "^27.4.0", "@types/node": "^16.11.9", "@types/react": "^17.0.39", diff --git a/packages/expo/src/ClerkProvider.tsx b/packages/expo/src/ClerkProvider.tsx index c912bc152f5..002043529e3 100644 --- a/packages/expo/src/ClerkProvider.tsx +++ b/packages/expo/src/ClerkProvider.tsx @@ -9,16 +9,17 @@ import { buildClerk } from './singleton'; export type ClerkProviderProps = ClerkReactProviderProps & { children: React.ReactNode; tokenCache?: TokenCache; + hotload?: boolean; }; export function ClerkProvider(props: ClerkProviderProps): JSX.Element { - const { children, tokenCache, ...rest } = props; + const { children, tokenCache, hotload, ...rest } = props; const frontendApi = props.frontendApi || process.env.CLERK_FRONTEND_API || ''; const clerkRef = React.useRef<ReturnType<typeof buildClerk> | null>(null); function getClerk() { - if (clerkRef.current === null) { + if (clerkRef.current === null && !hotload) { clerkRef.current = buildClerk({ frontendApi, tokenCache, diff --git a/packages/expo/src/singleton.ts b/packages/expo/src/singleton.ts index cf57d99c239..fef817d875c 100644 --- a/packages/expo/src/singleton.ts +++ b/packages/expo/src/singleton.ts @@ -22,8 +22,7 @@ export function buildClerk({ frontendApi, tokenCache }: BuildClerkOptions): Cler clerk = new Clerk(frontendApi); if (!tokenCache) { - // Exit early if tokenCache is not provided, assuming web platform - return; + return clerk; } // @ts-expect-error diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index 7d622cfad63..3c60c7f56d6 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.2.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/nextjs@3.1.0-alpha.1...@clerk/nextjs@3.2.0-alpha.1) (2022-03-23) + +### Features + +- **backend-core,clerk-sdk-node,nextjs,remix:** Add injected jwtKey option ([53e56e7](https://github.com/clerkinc/javascript/commit/53e56e76d59984d4d3f5b7e1e2d276adb8b2dc77)) + +## [3.2.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/nextjs@3.1.0-alpha.1...@clerk/nextjs@3.2.0-alpha.0) (2022-03-22) + +**Note:** Version bump only for package @clerk/nextjs + ## [3.1.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/nextjs@3.1.0-alpha.0...@clerk/nextjs@3.1.0-alpha.1) (2022-03-22) **Note:** Version bump only for package @clerk/nextjs diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index b16c93ecbe2..6310b83866e 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "3.1.0-alpha.1", + "version": "3.2.0-alpha.1", "license": "MIT", "description": "Clerk.dev SDK for NextJS", "keywords": [ @@ -32,10 +32,10 @@ "dev": "tsc -p tsconfig.build.json --watch" }, "dependencies": { - "@clerk/clerk-react": "^3.0.1-alpha.3", - "@clerk/clerk-sdk-node": "^3.1.0-alpha.1", - "@clerk/edge": "^1.1.0-alpha.1", - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/clerk-react": "^3.1.0-alpha.1", + "@clerk/clerk-sdk-node": "^3.2.0-alpha.1", + "@clerk/edge": "^1.2.0-alpha.1", + "@clerk/types": "^2.1.0-alpha.0", "tslib": "^2.3.1" }, "devDependencies": { diff --git a/packages/nextjs/src/middleware/types.ts b/packages/nextjs/src/middleware/types.ts index 240bed6cf84..75f98ed2578 100644 --- a/packages/nextjs/src/middleware/types.ts +++ b/packages/nextjs/src/middleware/types.ts @@ -8,6 +8,8 @@ export type Awaited<T> = T extends PromiseLike<infer U> ? U : T; export type WithServerSideAuthOptions = { loadUser?: boolean; loadSession?: boolean; + jwtKey?: string; + authorizedParties?: string[]; }; export type WithServerSideAuthCallback<Return, Options> = (context: ContextWithAuth<Options>) => Return; diff --git a/packages/nextjs/src/middleware/utils/getAuthData.ts b/packages/nextjs/src/middleware/utils/getAuthData.ts index b4aefbabc9c..ba5e47d0414 100644 --- a/packages/nextjs/src/middleware/utils/getAuthData.ts +++ b/packages/nextjs/src/middleware/utils/getAuthData.ts @@ -12,7 +12,7 @@ export async function getAuthData( opts: WithServerSideAuthOptions = {}, ): Promise<AuthData | null> { const { headers, cookies } = ctx.req; - const { loadSession, loadUser } = opts; + const { loadSession, loadUser, jwtKey, authorizedParties } = opts; try { const cookieToken = cookies['__session']; @@ -28,6 +28,8 @@ export async function getAuthData( referrer: headers.referer, userAgent: headers['user-agent'] as string, fetchInterstitial: () => Clerk.fetchInterstitial(), + jwtKey, + authorizedParties, }); if (status === AuthStatus.Interstitial) { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 2891a0c06d7..b4ae01ac7c3 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.1.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-react@3.0.1-alpha.3...@clerk/clerk-react@3.1.0-alpha.1) (2022-03-23) + +### Features + +- **clerk-js,types:** Rename UserButton params to afterSignOutUrl, afterMultiSessionSingleSignOutUrl ([c4cb76a](https://github.com/clerkinc/javascript/commit/c4cb76a1133fd2308b217cacaffb086b175f6347)) + +## [3.1.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/clerk-react@3.0.1-alpha.3...@clerk/clerk-react@3.1.0-alpha.0) (2022-03-22) + +**Note:** Version bump only for package @clerk/clerk-react + ### [3.0.1-alpha.3](https://github.com/clerkinc/javascript/compare/@clerk/clerk-react@3.0.1-alpha.2...@clerk/clerk-react@3.0.1-alpha.3) (2022-03-22) **Note:** Version bump only for package @clerk/clerk-react diff --git a/packages/react/README.md b/packages/react/README.md index 45131187be6..49f8209bd58 100644 --- a/packages/react/README.md +++ b/packages/react/README.md @@ -79,7 +79,7 @@ function App() { <> <h1>Hello Clerk!</h1> <SignedIn> - <UserButton afterSignOutAllUrl={window.location.href} /> + <UserButton afterSignOutUrl={window.location.href} /> </SignedIn> <SignedOut> <SignInButton mode='modal' /> diff --git a/packages/react/package.json b/packages/react/package.json index 867c72e6cba..3b7eed1d9a5 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "3.0.1-alpha.3", + "version": "3.1.0-alpha.1", "license": "MIT", "description": "Clerk.dev React library", "keywords": [ @@ -28,7 +28,7 @@ "test": "jest" }, "dependencies": { - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "tslib": "^2.3.1" }, "devDependencies": { diff --git a/packages/react/scripts/info.js b/packages/react/scripts/info.js index f07d87a85d5..b09d04d8cb2 100644 --- a/packages/react/scripts/info.js +++ b/packages/react/scripts/info.js @@ -4,10 +4,9 @@ const path = require('path'); fs.writeFileSync( path.resolve(__dirname, '../src/info.ts'), - ` -/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */ -export const LIB_VERSION='${packageJson.version}'; -export const LIB_NAME='${packageJson.name}'; + `/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */ +export const LIB_VERSION = '${packageJson.version}'; +export const LIB_NAME = '${packageJson.name}'; `, { encoding: 'utf-8' }, ); diff --git a/packages/react/src/info.ts b/packages/react/src/info.ts index 390bdfab75a..96f8dff035d 100644 --- a/packages/react/src/info.ts +++ b/packages/react/src/info.ts @@ -1,3 +1,3 @@ /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */ -export const LIB_VERSION = '3.0.1-alpha.3'; +export const LIB_VERSION = '3.1.0-alpha.1'; export const LIB_NAME = '@clerk/clerk-react'; diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 7e831ad904b..ae3ca698cfe 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.3.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/remix@0.2.0-alpha.1...@clerk/remix@0.3.0-alpha.1) (2022-03-23) + +### Features + +- **backend-core,clerk-sdk-node,nextjs,remix:** Add injected jwtKey option ([53e56e7](https://github.com/clerkinc/javascript/commit/53e56e76d59984d4d3f5b7e1e2d276adb8b2dc77)) + +## [0.3.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/remix@0.2.0-alpha.1...@clerk/remix@0.3.0-alpha.0) (2022-03-22) + +**Note:** Version bump only for package @clerk/remix + ## [0.2.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/remix@0.2.0-alpha.0...@clerk/remix@0.2.0-alpha.1) (2022-03-22) **Note:** Version bump only for package @clerk/remix diff --git a/packages/remix/package.json b/packages/remix/package.json index 785ea66d3ef..9d873cfc0ac 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "0.2.0-alpha.1", + "version": "0.3.0-alpha.1", "license": "MIT", "description": "Clerk.dev SDK for Remix", "keywords": [ @@ -32,9 +32,9 @@ "dev": "tsc -p tsconfig.build.json --watch" }, "dependencies": { - "@clerk/clerk-react": "^3.0.1-alpha.3", - "@clerk/clerk-sdk-node": "^3.1.0-alpha.1", - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/clerk-react": "^3.1.0-alpha.1", + "@clerk/clerk-sdk-node": "^3.2.0-alpha.1", + "@clerk/types": "^2.1.0-alpha.0", "cookie": "^0.4.2", "tslib": "^2.3.1" }, diff --git a/packages/remix/src/ssr/getAuthData.ts b/packages/remix/src/ssr/getAuthData.ts index 975282f18b9..dafe4d6e738 100644 --- a/packages/remix/src/ssr/getAuthData.ts +++ b/packages/remix/src/ssr/getAuthData.ts @@ -20,7 +20,7 @@ export async function getAuthData( req: Request, opts: RootAuthLoaderOptions = {}, ): Promise<{ authData: AuthData | null; showInterstitial?: boolean }> { - const { loadSession, loadUser } = opts; + const { loadSession, loadUser, jwtKey, authorizedParties } = opts; const { headers } = req; const cookies = parseCookies(req); @@ -38,6 +38,8 @@ export async function getAuthData( referrer: headers.get('referer'), userAgent: headers.get('user-agent') as string, fetchInterstitial: () => Promise.resolve(''), + authorizedParties, + jwtKey, }); if (status === AuthStatus.Interstitial) { diff --git a/packages/remix/src/ssr/types.ts b/packages/remix/src/ssr/types.ts index 7b5dbd7ec18..67f2bc2d870 100644 --- a/packages/remix/src/ssr/types.ts +++ b/packages/remix/src/ssr/types.ts @@ -8,6 +8,8 @@ export type RootAuthLoaderOptions = { frontendApi?: string; loadUser?: boolean; loadSession?: boolean; + jwtKey?: string; + authorizedParties?: []; }; export type RootAuthLoaderCallback<Options> = ( diff --git a/packages/sdk-node/CHANGELOG.md b/packages/sdk-node/CHANGELOG.md index 4d0477dc33d..b3b2369225a 100644 --- a/packages/sdk-node/CHANGELOG.md +++ b/packages/sdk-node/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.2.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-sdk-node@3.1.0-alpha.1...@clerk/clerk-sdk-node@3.2.0-alpha.1) (2022-03-23) + +### Features + +- **backend-core,clerk-sdk-node,nextjs,remix:** Add injected jwtKey option ([53e56e7](https://github.com/clerkinc/javascript/commit/53e56e76d59984d4d3f5b7e1e2d276adb8b2dc77)) + +## [3.2.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/clerk-sdk-node@3.1.0-alpha.1...@clerk/clerk-sdk-node@3.2.0-alpha.0) (2022-03-22) + +**Note:** Version bump only for package @clerk/clerk-sdk-node + ## [3.1.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-sdk-node@3.1.0-alpha.0...@clerk/clerk-sdk-node@3.1.0-alpha.1) (2022-03-22) **Note:** Version bump only for package @clerk/clerk-sdk-node diff --git a/packages/sdk-node/README.md b/packages/sdk-node/README.md index 64acfd47130..2cde579673a 100644 --- a/packages/sdk-node/README.md +++ b/packages/sdk-node/README.md @@ -713,6 +713,32 @@ export clerk.withAuth(handler); export clerk.requireAuth(handler); ``` +## Networkless token verification using the JWT verification key + +Clerk's JWT session token can be verified in a networkless manner using the JWT verification key. By default Clerk will use our JWKs endpoint to fetch and cache the key for any subsequent verification. If you use the `CLERK_JWT_KEY` environment variable to supply the key, Clerk will pick it up and do networkless verification for session tokens using it. + +To learn more about Clerk's token verification you can find more information on our [documentation](https://docs.clerk.dev/popular-guides/validating-session-tokens). + +The value of the JWT verification key can also be added on the instance level or on any single middleware call e.g. + +```ts +import { withAuth } from '@clerk/clerk-sdk-node'; + +const handler = (req, res) => { + // ... +}; + +withAuth(handler, { jwtKey: 'my_clerk_public_key' }); +``` + +Custom instance initialization: + +```ts +import Clerk from '@clerk/clerk-sdk-node/instance'; + +const clerk = new Clerk({ jwtKey: 'my_clerk_public_key' }); +``` + ## Validate the Authorized Party of a session token Clerk's JWT session token, contains the azp claim, which equals the Origin of the request during token generation. You can provide the middlewares with a list of whitelisted origins to verify against, to protect your application of the subdomain cookie leaking attack. You can find an example below: diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json index 0b9b3d56236..e60017b64f5 100644 --- a/packages/sdk-node/package.json +++ b/packages/sdk-node/package.json @@ -1,5 +1,5 @@ { - "version": "3.1.0-alpha.1", + "version": "3.2.0-alpha.1", "license": "MIT", "main": "dist/index.js", "module": "esm/index.js", @@ -47,7 +47,7 @@ "typescript": "^4.6.2" }, "dependencies": { - "@clerk/backend-core": "^0.7.0-alpha.1", + "@clerk/backend-core": "^0.8.0-alpha.1", "@peculiar/webcrypto": "^1.2.3", "camelcase-keys": "^6.2.2", "cookies": "^0.8.0", diff --git a/packages/sdk-node/scripts/info.js b/packages/sdk-node/scripts/info.js index f7551ec5ac2..5305fa0aa0c 100644 --- a/packages/sdk-node/scripts/info.js +++ b/packages/sdk-node/scripts/info.js @@ -4,10 +4,9 @@ const path = require('path'); fs.writeFileSync( path.resolve(__dirname, '../src/info.ts'), - ` -/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */ -export const LIB_VERSION="${packageJson.version}"; -export const LIB_NAME="${packageJson.name}"; + `/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */ +export const LIB_VERSION = '${packageJson.version}'; +export const LIB_NAME = '${packageJson.name}'; `, { encoding: 'utf-8' } ); diff --git a/packages/sdk-node/src/Clerk.ts b/packages/sdk-node/src/Clerk.ts index 798a1092b36..88ee211075d 100644 --- a/packages/sdk-node/src/Clerk.ts +++ b/packages/sdk-node/src/Clerk.ts @@ -25,6 +25,7 @@ import { Crypto, CryptoKey } from '@peculiar/webcrypto'; import { decodeBase64, toSPKIDer } from './utils/crypto'; const defaultApiKey = process.env.CLERK_API_KEY || ''; +const defaultJWTKey = process.env.CLERK_JWT_KEY; const defaultApiVersion = process.env.CLERK_API_VERSION || 'v1'; const defaultServerApiUrl = process.env.CLERK_API_URL || 'https://api.clerk.dev'; @@ -34,6 +35,7 @@ const packageRepo = 'https://github.com/clerkinc/clerk-sdk-node'; export type MiddlewareOptions = { onError?: Function; authorizedParties?: string[]; + jwtKey?: string; }; export type WithAuthProp<T> = T & { @@ -67,6 +69,7 @@ const verifySignature = async ( export default class Clerk extends ClerkBackendAPI { base: Base; + jwtKey?: string; httpOptions: OptionsOfUnknownResponseBody; _jwksClient: JwksClient; @@ -76,12 +79,14 @@ export default class Clerk extends ClerkBackendAPI { constructor({ apiKey = defaultApiKey, + jwtKey = defaultJWTKey, serverApiUrl = defaultServerApiUrl, apiVersion = defaultApiVersion, httpOptions = {}, jwksCacheMaxAge = JWKS_MAX_AGE, }: { apiKey?: string; + jwtKey?: string; serverApiUrl?: string; apiVersion?: string; httpOptions?: OptionsOfUnknownResponseBody; @@ -122,6 +127,7 @@ export default class Clerk extends ClerkBackendAPI { } this.httpOptions = httpOptions; + this.jwtKey = jwtKey; this._jwksClient = jwks({ jwksUri: `${serverApiUrl}/${apiVersion}/jwks`, @@ -163,7 +169,7 @@ export default class Clerk extends ClerkBackendAPI { importKey, verifySignature, decodeBase64, - process.env.CLERK_JWT_KEY ? undefined : loadCryptoKey + loadCryptoKey ); } @@ -230,7 +236,7 @@ export default class Clerk extends ClerkBackendAPI { } expressWithAuth( - { onError, authorizedParties }: MiddlewareOptions = { + { onError, authorizedParties, jwtKey }: MiddlewareOptions = { onError: this.defaultOnError, } ): (req: Request, res: Response, next: NextFunction) => Promise<void> { @@ -261,6 +267,7 @@ export default class Clerk extends ClerkBackendAPI { referrer: req.headers.referer, userAgent: req.headers['user-agent'] as string, authorizedParties, + jwtKey: jwtKey || this.jwtKey, fetchInterstitial: () => this.fetchInterstitial(), }); @@ -315,11 +322,11 @@ export default class Clerk extends ClerkBackendAPI { } expressRequireAuth( - { onError, authorizedParties }: MiddlewareOptions = { + options: MiddlewareOptions = { onError: this.strictOnError, } ) { - return this.expressWithAuth({ onError, authorizedParties }); + return this.expressWithAuth(options); } // Credits to https://nextjs.org/docs/api-routes/api-middlewares @@ -342,7 +349,7 @@ export default class Clerk extends ClerkBackendAPI { // Set the session on the request and then call provided handler withAuth( handler: Function, - { onError, authorizedParties }: MiddlewareOptions = { + options: MiddlewareOptions = { onError: this.defaultOnError, } ) { @@ -352,11 +359,7 @@ export default class Clerk extends ClerkBackendAPI { next?: NextFunction ) => { try { - await this._runMiddleware( - req, - res, - this.expressWithAuth({ onError, authorizedParties }) - ); + await this._runMiddleware(req, res, this.expressWithAuth(options)); return handler(req, res, next); } catch (error) { // @ts-ignore @@ -376,10 +379,10 @@ export default class Clerk extends ClerkBackendAPI { // Stricter version, short-circuits if session can't be determined requireAuth( handler: Function, - { onError, authorizedParties }: MiddlewareOptions = { + options: MiddlewareOptions = { onError: this.strictOnError, } ) { - return this.withAuth(handler, { onError, authorizedParties }); + return this.withAuth(handler, options); } } diff --git a/packages/sdk-node/src/__tests__/instance.test.ts b/packages/sdk-node/src/__tests__/instance.test.ts index af64a7f1883..422a905dad7 100644 --- a/packages/sdk-node/src/__tests__/instance.test.ts +++ b/packages/sdk-node/src/__tests__/instance.test.ts @@ -1,4 +1,5 @@ const TEST_API_KEY = 'TEST_API_KEY'; +const TEST_JWT_KEY = 'TEST_JWT_KEY'; describe('Custom Clerk instance initialization', () => { test('throw error when initialized without apiKey', () => { @@ -26,17 +27,21 @@ describe('Custom Clerk instance initialization', () => { test('custom keys overrides process env and default params', () => { jest.resetModules(); process.env.CLERK_API_KEY = TEST_API_KEY; + process.env.CLERK_JWT_KEY = TEST_JWT_KEY; const Clerk = require('../instance').default; expect(() => { - const customKey = 'custom_key'; + const customAPIKey = 'custom_api_key'; + const customJWTKey = 'custom_jwt_key'; const customAPIVersion = 'v0'; const customAPIUrl = 'https://customdomain.com'; const instance = new Clerk({ - apiKey: customKey, + apiKey: customAPIKey, + jwtKey: customJWTKey, serverApiUrl: customAPIUrl, apiVersion: customAPIVersion, }); - expect(instance._restClient.apiKey).toBe(customKey); + expect(instance._restClient.apiKey).toBe(customAPIKey); + expect(instance.jwtKey).toBe(customJWTKey); expect(instance._restClient.serverApiUrl).toBe(customAPIUrl); expect(instance._restClient.apiVersion).toBe(customAPIVersion); }).not.toThrow(Error); diff --git a/packages/sdk-node/src/info.ts b/packages/sdk-node/src/info.ts index e5cd7297199..33de90a7158 100644 --- a/packages/sdk-node/src/info.ts +++ b/packages/sdk-node/src/info.ts @@ -1,3 +1,3 @@ /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */ -export const LIB_VERSION = '3.1.0-alpha.1'; +export const LIB_VERSION = '3.2.0-alpha.1'; export const LIB_NAME = '@clerk/clerk-sdk-node'; diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index 3a8209e7e8e..153af515563 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +### [0.0.16-alpha.4](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.16-alpha.3...@clerk/shared@0.0.16-alpha.4) (2022-03-23) + +**Note:** Version bump only for package @clerk/shared + ### [0.0.16-alpha.3](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.16-alpha.2...@clerk/shared@0.0.16-alpha.3) (2022-03-22) **Note:** Version bump only for package @clerk/shared diff --git a/packages/shared/package.json b/packages/shared/package.json index 1d473359fb7..7559796c83a 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "0.0.16-alpha.3", + "version": "0.0.16-alpha.4", "private": true, "main": "index.js", "module": "index.js", @@ -26,7 +26,7 @@ "@babel/core": "^7.13.14", "@babel/preset-env": "^7.13.12", "@babel/preset-react": "^7.13.13", - "@clerk/types": "^2.0.1-alpha.3", + "@clerk/types": "^2.1.0-alpha.0", "@popperjs/core": "^2.5.4", "@sentry/browser": "^6.3.0", "@svgr/webpack": "^6.2.1", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 236c5120b50..811a53e4da3 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.1.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/types@2.0.1-alpha.3...@clerk/types@2.1.0-alpha.0) (2022-03-23) + +### Features + +- **clerk-js,types:** Rename UserButton params to afterSignOutUrl, afterMultiSessionSingleSignOutUrl ([c4cb76a](https://github.com/clerkinc/javascript/commit/c4cb76a1133fd2308b217cacaffb086b175f6347)) + ### [2.0.1-alpha.3](https://github.com/clerkinc/javascript/compare/@clerk/types@2.0.1-alpha.2...@clerk/types@2.0.1-alpha.3) (2022-03-22) ### Bug Fixes diff --git a/packages/types/package.json b/packages/types/package.json index 445c36e90fd..44f7e29f7c9 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/types", - "version": "2.0.1-alpha.3", + "version": "2.1.0-alpha.0", "license": "MIT", "description": "Typings for Clerk libraries.", "keywords": [ diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index 956d3099ede..042e05f7d07 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -374,15 +374,15 @@ export type UserButtonProps = { showName?: boolean; /** - * Full URL or path to navigate after sign-out is complete - * and there are not other active sessions on this client. + * Full URL or path to navigate after sign out is complete */ - afterSignOutAllUrl?: string; + afterSignOutUrl?: string; /** - * Full URL or path to navigate after sign-out is complete. + * Full URL or path to navigate after signing out the current user is complete. + * This option applies to multi-session applications. */ - afterSignOutOneUrl?: string; + afterMultiSessionSingleSignOutUrl?: string; /* * Full URL or path leading to the