From 0494b53d077335b2caf88a0083b6af5cd8b29a42 Mon Sep 17 00:00:00 2001 From: Rochanglien Infimate Date: Sun, 2 Apr 2023 19:04:30 +0530 Subject: [PATCH] Multi-tenancy support --- package.json | 7 ++++--- src/providers/AuthProvider.ts | 27 ++++++++++++++++++++++++--- yarn.lock | 10 +++++----- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index fb697fa..4fe547a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "react-admin-firebase", + "name": "@rinfimate/react-admin-firebase", "description": "A firebase data provider for the React Admin framework", - "version": "4.0.0", + "version": "4.0.3", "peerDependencies": { "firebase": "^9.6.4", "react": "17.x || 18.x", @@ -10,6 +10,7 @@ "react-router-dom": "5.x || 6.x" }, "dependencies": { + "jwt-decode": "^3.1.2", "lodash": "4.x", "path-browserify": "^1.0.0", "rxjs": "^6.5.x" @@ -35,7 +36,7 @@ "tslint-config-prettier": "^1.18.0", "typescript": "4.5.5" }, - "homepage": "https://github.com/benwinding/react-admin-firebase", + "homepage": "https://github.com/rinfimate/react-admin-firebase", "email": "hello@benwinding.com", "license": "MIT", "scripts": { diff --git a/src/providers/AuthProvider.ts b/src/providers/AuthProvider.ts index 63b3456..aa5c784 100644 --- a/src/providers/AuthProvider.ts +++ b/src/providers/AuthProvider.ts @@ -8,8 +8,10 @@ import { messageTypes } from './../misc/messageTypes'; import { IFirebaseWrapper } from './database'; import { FirebaseWrapper } from './database/firebase/FirebaseWrapper'; import { RAFirebaseOptions } from './options'; +import jwt_decode from "jwt-decode"; class AuthClient { + private fireWrapper: IFirebaseWrapper; constructor(firebaseConfig: {}, optionsInput?: RAFirebaseOptions) { @@ -23,9 +25,11 @@ class AuthClient { return this.fireWrapper.authSetPersistence(persistenceInput); } - public async HandleAuthLogin(params: { username: string; password: string }) { - const { username, password } = params; - + public async HandleAuthLogin(params: { username: string; password: string, tenant?: string }) { + const { username, password, tenant } = params; + if (tenant) { + this.fireWrapper.auth().tenantId = tenant; + } if (username && password) { try { const user = await this.fireWrapper.authSigninEmailPassword( @@ -182,6 +186,21 @@ class AuthClient { return null; } } + + public async HandleGetTenant() { + try { + const user = await this.getUserLogin(); + // @ts-ignore + const token = await user.getIdTokenResult(); + const decodedToken:any = jwt_decode(token.token); + return decodedToken["firebase"]["tenant"]; + } catch (e) { + log('HandleGetTenant: no user is logged in or tokenResult error', { + e, + }); + return null; + } + } } export function AuthProvider( @@ -207,6 +226,7 @@ export function AuthProvider( getJWTSignInProvider: () => auth.HandleGetJWTSignInProvider(), getJWTClaims: () => auth.HandleGetPermissions(), getJWTToken: () => auth.HandleGetJWTToken(), + getTenant: () => auth.HandleGetTenant(), }; return provider; } @@ -219,6 +239,7 @@ export type ReactAdminFirebaseAuthProvider = RaAuthProvider & { getJWTSignInProvider: () => Promise; getJWTClaims: () => Promise<{ [key: string]: any } | null>; getJWTToken: () => Promise; + getTenant: () => Promise; }; function VerifyAuthProviderArgs( diff --git a/yarn.lock b/yarn.lock index 5a93e57..100a9d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7241,6 +7241,11 @@ jws@^4.0.0: jwa "^2.0.0" safe-buffer "^5.0.1" +jwt-decode@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -9037,11 +9042,6 @@ prettier-plugin-organize-imports@^3.2.2: resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.2.tgz#91993365e017daa5d0d28d8183179834224d8dd1" integrity sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA== -prettier-plugin-organize-imports@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.2.tgz#91993365e017daa5d0d28d8183179834224d8dd1" - integrity sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA== - prettier@^2.8.3: version "2.8.4" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3"