Skip to content
This repository was archived by the owner on Aug 21, 2024. It is now read-only.

Commit c5d50f3

Browse files
committed
Updated JWT authentication to handle RSA signatures
New authentication-setting fields for JWT algorithm and JWT public key. Keys should be inserted as strings with '\n' replacing new lines. Replaced the last of the API.instance.client uses with Engine.instance.api Added a new service that will return the JWT public key. Resolves IR-3827
1 parent bce156b commit c5d50f3

File tree

25 files changed

+473
-92
lines changed

25 files changed

+473
-92
lines changed

packages/client-core/i18n/en/admin.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,8 @@
367367
"service": "Service",
368368
"githubAppId": "App ID (Enter for GitHub App, omit for OAuth App)",
369369
"secret": "Secret",
370+
"jwtAlgorithm": "JWT Algorithm",
371+
"jwtPublicKey": "JWT Public Key",
370372
"entity": "Entity",
371373
"authStrategies": "Authentication Strategies",
372374
"userName": "User Name",

packages/client-core/src/API.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export type FeathersClient = FeathersApplication<ServiceTypes> &
4444
/**@deprecated - use 'Engine.instance.api' instead */
4545
export class API {
4646
/**@deprecated - use 'Engine.instance.api' instead */
47-
static instance: API
47+
static instance
4848
client: FeathersClient
4949

5050
static createAPI = () => {
@@ -61,13 +61,8 @@ export class API {
6161
})
6262
)
6363

64-
primus.on('reconnected', () => API.instance.client.reAuthenticate(true))
65-
66-
API.instance = new API()
67-
API.instance.client = feathersClient as any
64+
primus.on('reconnected', () => feathersClient.reAuthenticate(true))
6865

6966
Engine.instance.api = feathersClient
7067
}
7168
}
72-
73-
globalThis.API = API

packages/client-core/src/admin/components/settings/tabs/authentication.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,20 @@ const AuthenticationTab = forwardRef(({ open }: { open: boolean }, ref: React.Mu
199199
/>
200200

201201
<Input
202+
className="col-span-1"
203+
label={t('admin:components.setting.entity')}
204+
value={authSetting?.entity || ''}
205+
disabled
206+
/>
207+
208+
<Input
209+
className="col-span-1"
210+
label={t('admin:components.setting.jwtAlgorithm')}
211+
value={authSetting?.jwtAlgorithm || ''}
212+
disabled
213+
/>
214+
215+
<PasswordInput
202216
className="col-span-1"
203217
label={t('admin:components.setting.secret')}
204218
value={authSetting?.secret || ''}
@@ -207,8 +221,8 @@ const AuthenticationTab = forwardRef(({ open }: { open: boolean }, ref: React.Mu
207221

208222
<Input
209223
className="col-span-1"
210-
label={t('admin:components.setting.entity')}
211-
value={authSetting?.entity || ''}
224+
label={t('admin:components.setting.jwtPublicKey')}
225+
value={authSetting?.jwtPublicKey || ''}
212226
disabled
213227
/>
214228
</div>

packages/client-core/src/components/InstanceChat/InstanceChat.skiptest.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ import { createRoot } from 'react-dom/client'
3030

3131
import { ChannelID, MessageID, UserID } from '@etherealengine/common/src/schema.type.module'
3232
import { createEngine } from '@etherealengine/ecs'
33+
import { Engine } from '@etherealengine/ecs/src/Engine'
3334
import { getMutableState } from '@etherealengine/hyperflux'
3435

3536
import { InstanceChat } from '.'
3637
import { createDOM } from '../../../tests/createDOM'
3738
import { createMockAPI } from '../../../tests/createMockAPI'
38-
import { API } from '../../API'
3939
import { ChannelState } from '../../social/services/ChannelService'
4040

4141
describe('Instance Chat Component', () => {
@@ -46,7 +46,7 @@ describe('Instance Chat Component', () => {
4646
rootContainer = document.createElement('div')
4747
document.body.appendChild(rootContainer)
4848
createEngine()
49-
API.instance = createMockAPI()
49+
Engine.instance.api = createMockAPI()
5050
})
5151

5252
afterEach(() => {

packages/client-core/src/social/services/LocationService.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import { Engine } from '@etherealengine/ecs/src/Engine'
3737
import { defineState, getMutableState, getState } from '@etherealengine/hyperflux'
3838

3939
import { useEffect } from 'react'
40-
import { API } from '../../API'
4140
import { NotificationService } from '../../common/services/NotificationService'
4241
import { AuthState } from '../../user/services/AuthService'
4342

@@ -141,15 +140,15 @@ export const LocationService = {
141140
getLocation: async (locationId: LocationID) => {
142141
try {
143142
LocationState.fetchingCurrentSocialLocation()
144-
const location = await API.instance.client.service(locationPath).get(locationId)
143+
const location = await Engine.instance.api.service(locationPath).get(locationId)
145144
LocationState.socialLocationRetrieved(location)
146145
} catch (err) {
147146
NotificationService.dispatchNotify(err.message, { variant: 'error' })
148147
}
149148
},
150149
getLocationByName: async (locationName: string) => {
151150
LocationState.fetchingCurrentSocialLocation()
152-
const locationResult = (await API.instance.client.service(locationPath).find({
151+
const locationResult = (await Engine.instance.api.service(locationPath).find({
153152
query: {
154153
slugifiedName: locationName
155154
}
@@ -167,7 +166,7 @@ export const LocationService = {
167166
}
168167
},
169168
getLobby: async () => {
170-
const lobbyResult = (await API.instance.client.service(locationPath).find({
169+
const lobbyResult = (await Engine.instance.api.service(locationPath).find({
171170
query: {
172171
isLobby: true,
173172
$limit: 1
@@ -182,7 +181,7 @@ export const LocationService = {
182181
},
183182
banUserFromLocation: async (userId: UserID, locationId: LocationID) => {
184183
try {
185-
await API.instance.client.service(locationBanPath).create({
184+
await Engine.instance.api.service(locationBanPath).create({
186185
userId: userId,
187186
locationId: locationId
188187
})

packages/client-core/src/user/components/UserMenu/menus/LocationMenu.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import React, { useEffect, useState } from 'react'
2828
import { useTranslation } from 'react-i18next'
2929

3030
import { locationPath, LocationType } from '@etherealengine/common/src/schema.type.module'
31+
import { Engine } from '@etherealengine/ecs/src/Engine'
3132
import Button from '@etherealengine/ui/src/primitives/mui/Button'
3233
import Icon from '@etherealengine/ui/src/primitives/mui/Icon'
3334
import InputAdornment from '@etherealengine/ui/src/primitives/mui/InputAdornment'
@@ -40,7 +41,6 @@ import TableRow from '@etherealengine/ui/src/primitives/mui/TableRow'
4041
import TextField from '@etherealengine/ui/src/primitives/mui/TextField'
4142
import Typography from '@etherealengine/ui/src/primitives/mui/Typography'
4243

43-
import { API } from '../../../../API'
4444
import { LocationSeed } from '../../../../social/services/LocationService'
4545
import styles from '../index.module.scss'
4646

@@ -68,7 +68,7 @@ const LocationMenu = (props: Props) => {
6868
}, [])
6969

7070
const fetchLocations = (page: number, rows: number, search?: string) => {
71-
API.instance.client
71+
Engine.instance.api
7272
.service(locationPath)
7373
.find({
7474
query: {

0 commit comments

Comments
 (0)