From 4a7e5be6e4182ee9293cb0f7689ccae5a436d33d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Miguel=20Gon=C3=A7alves?= Date: Sun, 14 Jan 2024 09:19:39 +0000 Subject: [PATCH] feat(): use tokenParsed instead of jwt-decode --- package-lock.json | 2 -- package.json | 2 -- src/keycloak.ts | 4 ++-- src/state.test.ts | 16 +++++++++++++++- src/state.ts | 18 +++++------------- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 657cfec..eedc10f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,6 @@ "eslint-plugin-vue": "^9.19.2", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", - "jwt-decode": "^4.0.0", "keycloak-js": "^23.0.3", "prettier": "^2.8.8", "rimraf": "^5.0.5", @@ -34,7 +33,6 @@ "vue": "^3.3.12" }, "peerDependencies": { - "jwt-decode": "^4.0.0", "keycloak-js": "20 - 23", "vue": "^3.2.45" } diff --git a/package.json b/package.json index 536ea83..846d613 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,6 @@ ], "license": "Apache-2.0", "peerDependencies": { - "jwt-decode": "^4.0.0", "keycloak-js": "20 - 23", "vue": "^3.2.45" }, @@ -61,7 +60,6 @@ "eslint-plugin-vue": "^9.19.2", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", - "jwt-decode": "^4.0.0", "keycloak-js": "^23.0.3", "prettier": "^2.8.8", "rimraf": "^5.0.5", diff --git a/src/keycloak.ts b/src/keycloak.ts index 626a45f..d291909 100644 --- a/src/keycloak.ts +++ b/src/keycloak.ts @@ -21,7 +21,7 @@ export async function updateToken(minValidity: number): Promise { try { await $keycloak.updateToken(minValidity) - setToken($keycloak.token as string) + setToken($keycloak.token, $keycloak.tokenParsed) } catch (error) { hasFailed(true) throw new Error('Failed to refresh the token, or the session has expired') @@ -40,7 +40,7 @@ export async function initKeycloak(initConfig: Keycloak.KeycloakInitOptions): Pr const _isAuthenticated = await $keycloak.init(initConfig) isAuthenticated(_isAuthenticated) if (!isNil($keycloak.token)) { - setToken($keycloak.token as string) + setToken($keycloak.token, $keycloak.tokenParsed) } } catch (error) { hasFailed(true) diff --git a/src/state.test.ts b/src/state.test.ts index 0822d0c..ce09663 100644 --- a/src/state.test.ts +++ b/src/state.test.ts @@ -3,6 +3,20 @@ import { state, setToken } from './state' describe('state', () => { const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJteS1uYW1lIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm15LXJvbGUiXX0sInJlc291cmNlX2FjY2VzcyI6eyJteS1hcHAiOnsicm9sZXMiOlsibXktcm9sZSJdfX19.oAnF7H8DndIWOb2KeHntbzwf6h7VjZlxt5AR2KPZTBU' + const tokenParsed = { + sub: '1234567890', + name: 'John Doe', + iat: 1516239022, + preferred_username: 'my-name', + realm_access: { + roles: ['my-role'], + }, + resource_access: { + 'my-app': { + roles: ['my-role'], + }, + }, + } test('should have the correct inital values', () => { expect(state.isAuthenticated).toBe(false) @@ -15,7 +29,7 @@ describe('state', () => { }) test('should update the state', () => { - setToken(token) + setToken(token, tokenParsed) expect(state.token).toBe(token) expect(state.username).toBe('my-name') diff --git a/src/state.ts b/src/state.ts index 54a1f69..ce58f5f 100644 --- a/src/state.ts +++ b/src/state.ts @@ -1,12 +1,12 @@ import { reactive } from 'vue' -import { jwtDecode } from 'jwt-decode' +import type { KeycloakTokenParsed } from 'keycloak-js' -export interface KeycloakState { +export interface KeycloakState { isAuthenticated: boolean hasFailed: boolean isPending: boolean token: string - decodedToken: T + decodedToken: KeycloakTokenParsed username: string roles: string[] resourceRoles: Record @@ -23,17 +23,9 @@ export const state = reactive({ resourceRoles: {}, }) -interface TokenContent { - preferred_username: string - realm_access: { - roles: string[] - } - resource_access: Record -} - -export const setToken = (token: string): void => { +export const setToken = (token: string, tokenParsed: KeycloakTokenParsed): void => { state.token = token - const content = jwtDecode(state.token) + const content = tokenParsed state.decodedToken = content state.roles = content.realm_access ? content.realm_access.roles : [] state.username = content.preferred_username