Compare commits
2 Commits
59bfa9bd55
...
e87b1ddde5
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e87b1ddde5 | ||
![]() |
b63973a9ba |
@ -1,122 +0,0 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
|
||||||
import JwtService from "@Front/Services/JwtService/JwtService";
|
|
||||||
|
|
||||||
interface JwtDebuggerProps {
|
|
||||||
expectedRules?: string[];
|
|
||||||
showAlways?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function JwtDebugger({ expectedRules = [], showAlways = false }: JwtDebuggerProps) {
|
|
||||||
const [isVisible, setIsVisible] = useState(showAlways);
|
|
||||||
const [debugInfo, setDebugInfo] = useState<any>(null);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// Only show in development
|
|
||||||
if (process.env.NODE_ENV !== "development" && !showAlways) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const jwt = JwtService.getInstance().debugJwtToken();
|
|
||||||
if (jwt) {
|
|
||||||
setDebugInfo(jwt);
|
|
||||||
}
|
|
||||||
}, [showAlways]);
|
|
||||||
|
|
||||||
// Keyboard shortcut to toggle debugger (Ctrl+Shift+D)
|
|
||||||
useEffect(() => {
|
|
||||||
const handleKeyDown = (e: KeyboardEvent) => {
|
|
||||||
if (e.ctrlKey && e.shiftKey && e.key === "D") {
|
|
||||||
e.preventDefault();
|
|
||||||
setIsVisible(!isVisible);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
document.addEventListener("keydown", handleKeyDown);
|
|
||||||
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
||||||
}, [isVisible]);
|
|
||||||
|
|
||||||
if (!isVisible) return null;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div style={{
|
|
||||||
position: "fixed",
|
|
||||||
top: "10px",
|
|
||||||
right: "10px",
|
|
||||||
background: "#1a1a1a",
|
|
||||||
color: "#fff",
|
|
||||||
padding: "15px",
|
|
||||||
borderRadius: "8px",
|
|
||||||
fontSize: "12px",
|
|
||||||
fontFamily: "monospace",
|
|
||||||
maxWidth: "400px",
|
|
||||||
maxHeight: "80vh",
|
|
||||||
overflow: "auto",
|
|
||||||
zIndex: 9999,
|
|
||||||
border: "1px solid #333"
|
|
||||||
}}>
|
|
||||||
<div style={{ marginBottom: "10px", display: "flex", justifyContent: "space-between", alignItems: "center" }}>
|
|
||||||
<strong>JWT Debugger</strong>
|
|
||||||
<button
|
|
||||||
onClick={() => setIsVisible(false)}
|
|
||||||
style={{ background: "none", border: "none", color: "#fff", cursor: "pointer" }}
|
|
||||||
>
|
|
||||||
✕
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{debugInfo && (
|
|
||||||
<div>
|
|
||||||
<div><strong>User ID:</strong> {debugInfo.userId}</div>
|
|
||||||
<div><strong>Email:</strong> {debugInfo.email}</div>
|
|
||||||
<div><strong>Role:</strong> {debugInfo.role}</div>
|
|
||||||
<div><strong>Office ID:</strong> {debugInfo.office_Id}</div>
|
|
||||||
<div><strong>Rules Count:</strong> {debugInfo.rules?.length || 0}</div>
|
|
||||||
<div><strong>Rules:</strong></div>
|
|
||||||
<ul style={{ margin: "5px 0", paddingLeft: "20px" }}>
|
|
||||||
{debugInfo.rules?.map((rule: string, index: number) => (
|
|
||||||
<li key={index}>{rule}</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
<div><strong>Expires:</strong> {new Date(debugInfo.exp * 1000).toLocaleString()}</div>
|
|
||||||
|
|
||||||
{expectedRules.length > 0 && (
|
|
||||||
<div style={{ marginTop: "15px" }}>
|
|
||||||
<div><strong>Expected Rules:</strong></div>
|
|
||||||
<ul style={{ margin: "5px 0", paddingLeft: "20px" }}>
|
|
||||||
{expectedRules.map((rule, index) => (
|
|
||||||
<li key={index} style={{
|
|
||||||
color: debugInfo.rules?.includes(rule) ? "#4ade80" : "#f87171"
|
|
||||||
}}>
|
|
||||||
{rule} {debugInfo.rules?.includes(rule) ? "✓" : "✗"}
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<div style={{ marginTop: "15px" }}>
|
|
||||||
<strong>Quick Tests:</strong>
|
|
||||||
<div style={{ marginTop: "5px" }}>
|
|
||||||
<button
|
|
||||||
onClick={() => JwtService.getInstance().checkSpecificRule("folders", "GET")}
|
|
||||||
style={{ marginRight: "5px", padding: "2px 5px", fontSize: "10px" }}
|
|
||||||
>
|
|
||||||
Test GET folders
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
onClick={() => JwtService.getInstance().checkSpecificRule("users", "POST")}
|
|
||||||
style={{ marginRight: "5px", padding: "2px 5px", fontSize: "10px" }}
|
|
||||||
>
|
|
||||||
Test POST users
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<div style={{ marginTop: "10px", fontSize: "10px", color: "#888" }}>
|
|
||||||
Press Ctrl+Shift+D to toggle
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
@ -36,7 +36,6 @@ export default function Header(props: IProps) {
|
|||||||
|
|
||||||
const loadSubscription = useCallback(async () => {
|
const loadSubscription = useCallback(async () => {
|
||||||
const jwt = JwtService.getInstance().decodeJwt();
|
const jwt = JwtService.getInstance().decodeJwt();
|
||||||
console.log("jwt:", jwt);
|
|
||||||
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
||||||
if (subscription[0]) {
|
if (subscription[0]) {
|
||||||
const stripeSubscription = await Stripe.getInstance().getStripeSubscriptionByUid(subscription[0].stripe_subscription_id!);
|
const stripeSubscription = await Stripe.getInstance().getStripeSubscriptionByUid(subscription[0].stripe_subscription_id!);
|
||||||
|
@ -18,7 +18,6 @@ export default function SubscriptionError() {
|
|||||||
|
|
||||||
const loadSubscription = useCallback(async () => {
|
const loadSubscription = useCallback(async () => {
|
||||||
const jwt = JwtService.getInstance().decodeJwt();
|
const jwt = JwtService.getInstance().decodeJwt();
|
||||||
console.log("jwt:", jwt);
|
|
||||||
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
||||||
if (!subscription[0]) return;
|
if (!subscription[0]) return;
|
||||||
setSubscription(subscription[0]);
|
setSubscription(subscription[0]);
|
||||||
|
@ -42,7 +42,6 @@ export default function SubscriptionFacturation() {
|
|||||||
const manageSubscription = async () => {
|
const manageSubscription = async () => {
|
||||||
try {
|
try {
|
||||||
const jwt = JwtService.getInstance().decodeJwt();
|
const jwt = JwtService.getInstance().decodeJwt();
|
||||||
console.log("jwt:", jwt);
|
|
||||||
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
||||||
if (!subscription[0]) return;
|
if (!subscription[0]) return;
|
||||||
const stripe_client_portal = await Stripe.getInstance().getClientPortalSession(subscription[0].stripe_subscription_id!);
|
const stripe_client_portal = await Stripe.getInstance().getClientPortalSession(subscription[0].stripe_subscription_id!);
|
||||||
@ -53,7 +52,6 @@ export default function SubscriptionFacturation() {
|
|||||||
const cancelOrReactivateSubscription = async () => {
|
const cancelOrReactivateSubscription = async () => {
|
||||||
try {
|
try {
|
||||||
const jwt = JwtService.getInstance().decodeJwt();
|
const jwt = JwtService.getInstance().decodeJwt();
|
||||||
console.log("jwt:", jwt);
|
|
||||||
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
||||||
if (!subscription[0]) return;
|
if (!subscription[0]) return;
|
||||||
const stripe_client_portal = await Stripe.getInstance().getClientPortalSession(subscription[0].stripe_subscription_id!);
|
const stripe_client_portal = await Stripe.getInstance().getClientPortalSession(subscription[0].stripe_subscription_id!);
|
||||||
@ -68,7 +66,6 @@ export default function SubscriptionFacturation() {
|
|||||||
const manageBilling = async () => {
|
const manageBilling = async () => {
|
||||||
try {
|
try {
|
||||||
const jwt = JwtService.getInstance().decodeJwt();
|
const jwt = JwtService.getInstance().decodeJwt();
|
||||||
console.log("jwt:", jwt);
|
|
||||||
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
||||||
if (!subscription[0]) return;
|
if (!subscription[0]) return;
|
||||||
const stripe_client_portal = await Stripe.getInstance().getClientPortalSession(subscription[0].stripe_subscription_id!);
|
const stripe_client_portal = await Stripe.getInstance().getClientPortalSession(subscription[0].stripe_subscription_id!);
|
||||||
@ -78,7 +75,6 @@ export default function SubscriptionFacturation() {
|
|||||||
|
|
||||||
const loadSubscription = useCallback(async () => {
|
const loadSubscription = useCallback(async () => {
|
||||||
const jwt = JwtService.getInstance().decodeJwt();
|
const jwt = JwtService.getInstance().decodeJwt();
|
||||||
console.log("jwt:", jwt);
|
|
||||||
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
||||||
if (!subscription[0]) {
|
if (!subscription[0]) {
|
||||||
router.push(Module.getInstance().get().modules.pages.Subscription.pages.New.props.path);
|
router.push(Module.getInstance().get().modules.pages.Subscription.pages.New.props.path);
|
||||||
|
@ -21,7 +21,6 @@ export default function SubscriptionSuccess() {
|
|||||||
|
|
||||||
const loadSubscription = useCallback(async () => {
|
const loadSubscription = useCallback(async () => {
|
||||||
const jwt = JwtService.getInstance().decodeJwt();
|
const jwt = JwtService.getInstance().decodeJwt();
|
||||||
console.log("jwt:", jwt);
|
|
||||||
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } });
|
||||||
if (!subscription[0]) return;
|
if (!subscription[0]) return;
|
||||||
setSubscription(subscription[0]);
|
setSubscription(subscription[0]);
|
||||||
|
@ -165,75 +165,4 @@ export default class JwtService {
|
|||||||
if (!token) return false;
|
if (!token) return false;
|
||||||
return token?.rules?.some((rule: string) => rule === `${action} ${name}`);
|
return token?.rules?.some((rule: string) => rule === `${action} ${name}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Debug method to log JWT token details including rules
|
|
||||||
*/
|
|
||||||
public debugJwtToken() {
|
|
||||||
const token = this.decodeJwt();
|
|
||||||
if (!token) {
|
|
||||||
console.warn("No JWT token found");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("=== JWT Token Debug Info ===");
|
|
||||||
console.log("User ID:", token.userId);
|
|
||||||
console.log("Email:", token.email);
|
|
||||||
console.log("Role:", token.role);
|
|
||||||
console.log("Office ID:", token.office_Id);
|
|
||||||
console.log("Rules count:", token.rules?.length || 0);
|
|
||||||
console.log("Rules:", token.rules);
|
|
||||||
console.log("Expiration:", new Date(token.exp * 1000).toISOString());
|
|
||||||
console.log("=============================");
|
|
||||||
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a specific rule exists in the JWT token
|
|
||||||
*/
|
|
||||||
public checkSpecificRule(name: string, action: string) {
|
|
||||||
const token = this.decodeJwt();
|
|
||||||
if (!token) {
|
|
||||||
console.warn("No JWT token found");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const expectedRule = `${action} ${name}`;
|
|
||||||
const hasRule = token?.rules?.some((rule: string) => rule === expectedRule);
|
|
||||||
|
|
||||||
console.log(`=== Rule Check: ${expectedRule} ===`);
|
|
||||||
console.log("Expected rule:", expectedRule);
|
|
||||||
console.log("Available rules:", token.rules);
|
|
||||||
console.log("Rule found:", hasRule);
|
|
||||||
console.log("=============================");
|
|
||||||
|
|
||||||
return hasRule;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compare JWT rules with expected rules from database
|
|
||||||
*/
|
|
||||||
public compareRulesWithDatabase(expectedRules: string[]) {
|
|
||||||
const token = this.decodeJwt();
|
|
||||||
if (!token) {
|
|
||||||
console.warn("No JWT token found");
|
|
||||||
return { missing: expectedRules, extra: [], matches: [] };
|
|
||||||
}
|
|
||||||
|
|
||||||
const jwtRules = token.rules || [];
|
|
||||||
const missing = expectedRules.filter(rule => !jwtRules.includes(rule));
|
|
||||||
const extra = jwtRules.filter(rule => !expectedRules.includes(rule));
|
|
||||||
const matches = jwtRules.filter(rule => expectedRules.includes(rule));
|
|
||||||
|
|
||||||
console.log("=== Rules Comparison ===");
|
|
||||||
console.log("Expected rules (from DB):", expectedRules);
|
|
||||||
console.log("JWT rules:", jwtRules);
|
|
||||||
console.log("Missing rules:", missing);
|
|
||||||
console.log("Extra rules:", extra);
|
|
||||||
console.log("Matching rules:", matches);
|
|
||||||
console.log("=========================");
|
|
||||||
|
|
||||||
return { missing, extra, matches };
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user