Security News
Supply Chain Attack Detected in @solana/web3.js Library
A supply chain attack has been detected in versions 1.95.6 and 1.95.7 of the popular @solana/web3.js library.
@relotus/keycloak
Advanced tools
@relotus/keycloak
@relotus/keycloak - npm-пакет для работы авторизации в корпоративном Keycloak
npm install @relotus/keycloak
Для использования Keycloak в приложении его необходимо проинициализировать:
import { initKeycloak } from '@relotus/keycloak';
const KeycloakProvider = initKeycloak({
url: config.AUTH_HTTP,
realm: config.AUTH_REALM,
clientId: config.AUTH_CLIENT_ID,
});
KeycloakProvider
- это компонент, в которое необходимо обернуть приложение для работы хуков из этого пакета.
ВАЖНО
Если в вашем проекте используется
ResetErrorBoundary
из@relotus/utkonos
, то он должен быть ребенком дляKeycloakProvider
, а не наоборот:
<KeycloakProvider onUserLogin={login} onUserLogOut={logout}> <ErrorBoundary> <Provider store={store}>{appContent}</Provider> </ErrorBoundary> </KeycloakProvider>
В противном случае это приведет к тому, что в случае ошибки будет бесконечный редирект в Keycloak
Для упрощения работы с токеном, вы можете при вызове initKeycloak
передать Аxios и для него будет установлен интерцептор:
import { initKeycloak } from '@relotus/keycloak';
const KeycloakProvider = initKeycloak(config, axios);
Теперь для каждого запроса будет добавлен заголовок Authorization
со значением Bearer ${keycloak.token}
.
Если в вашем приложении используется адаптер поверх Axios то можно использовать функцию bindInterceptor
. Функция возвращает функцию, вызов которой уберет интерцептор.
import { initKeycloak } from '@relotus/keycloak';
import { bindInterceptor } from '@relotus/keycloak/src/interceptor';
const KeycloakProvider = initKeycloak(config, axios);
const { keycloak } = KeycloakProvider;
class Api {
private _axios: AxiosInstance;
private removeInterceptor: () => void;
constructor() {
this._axios = axios.create({
baseURL: `${config.API_BASE_URL}/web`,
paramsSerializer: formatParams,
});
this.removeInterceptor = bindInterceptor(this._axios, keycloak);
}
}
Есть несколько способов обработать события авторизации:
Самый простой - пробросить в KeycloakProvider обработчики для событий авторизации и завершения сессии:
import { initKeycloak } from '@relotus/keycloak';
const KeycloakProvider = initKeycloak(config, axios);
function App() {
const handleLogin = useCallback((profile: KeycloakProfile) => {}, []);
const handleLogout = useCallback(() => {}, []);
return (
<KeycloakProvider onUserLogin={handleLogin} onUserLogOut={handleLogout}>
<MyApp />
</KeycloakProvider>
);
}
Использовать chanel для саги
import { createKeycloakChannel, events } '@relotus/keycloak/src/saga';
function* saga() {
const keycloakChannel = yield call(createKeycloakChannel)
try {
while (true) {
let keycloakEvent = yield take(keycloakChannel)
if(events.authSuccess(keycloakEvent)){
// обрабатываем авторизацию;
const { payload } = keycloakEvent
}
}
} finally {
if (yield cancelled()) {
keycloakChannel.close()
}
}
}
Для всех остальных случаев есть возможность подписаться на AuthClientEvent
напрямую:
import { initKeycloak } from '@relotus/keycloak';
const KeycloakProvider = initKeycloak(config, axios);
const eventName: AuthClientEvent = 'onAuthSuccess';
const unsubscribe = KeycloakProvider.subscribe(
eventName,
({ keycloak, error }: { error?: AuthClientError; keycloak: KeycloakInstance }) => {
// Обрабатываем событие
},
);
// Отписываемся
unsubscribe();
Для получения доступа в компонентах можно использовать хук useKeycloak
:
import { useKeycloak } from '@relotus/keycloak';
const { keycloak } = useKeycloak();
const logout = useCallback(() => {
keycloak.logout().catch(() => {
/* обрабатываем ошибку */
});
}, [toggleDetails]);
Вне компонентов, например для вызова Keycloak#logout()
:
const { keycloak } = KeycloakProvider;
keycloak.logout().catch(() => {
/* обрабатываем ошибку */
});
ВАЖНО
Роли настраиваются для
clientId
илиrealmId
в админке Keycloak
Для проверки ролей в компоненте можно использовать хук useHasRole
import { useHasRole } from '@relotus/keycloak';
function Component() {
const hasAdminRole = useHasRole('ADMIN');
return hasAdminRole ? 'Я админ' : 'Я пользователь';
}
Хук проверяет как роли для для clientId
, так и для realmId
.
Вне компонента можно воспользоваться вызовом методов hasRealmRole
(проверка роли для realmId
) или hasResourceRole
(проверка роли для clientId
)
const isRealmManager = keycloak.hasRealmRole('MANAGER');
const isClientHasAccessToDictionaries = keycloak.hasResourceRole('Dictionaries.READ');
Для проверки роли можно воспользоваться утилитой hasRole
:
import { hasRole } from '@relotus/keycloak/src/utils';
const { keycloak } = KeycloakProvider;
const hasAdminRole = hasRole(keycloak, 'ADMIN'); // Имеет роль ADMIN для clientId или для realmId
Для удобства тестирования в setupTests
или в каждом тесте где это необходимо можно добавить:
import '@relotus/keycloak/src/mock';
FAQs
react keycloak package
The npm package @relotus/keycloak receives a total of 2 weekly downloads. As such, @relotus/keycloak popularity was classified as not popular.
We found that @relotus/keycloak demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
A supply chain attack has been detected in versions 1.95.6 and 1.95.7 of the popular @solana/web3.js library.
Research
Security News
A malicious npm package targets Solana developers, rerouting funds in 2% of transactions to a hardcoded address.
Security News
Research
Socket researchers have discovered malicious npm packages targeting crypto developers, stealing credentials and wallet data using spyware delivered through typosquats of popular cryptographic libraries.