#reactjs #ldap #single-sign-on #keycloak
#reactjs #ldap #единый вход #скрытый ключ
Вопрос:
Если пользователь keycloak, используемый моим приложением react, уже вошел в систему через другое приложение, тогда он не должен снова запрашивать аутентификацию через мое приложение react (начиная с единого входа). как я могу этого добиться ?? пожалуйста, предоставьте решение для этого.
я использую keycloak для аутентификации приложения react.проверка подлинности с помощью ключа работает нормально. пробовал с помощью единого входа, но он не работает.я хочу, чтобы приложение react работало с одинарным входом keycloak, т.е. Когда пользователь keycloak входит в систему, он не должен повторно запрашивать учетные данные для входа. приложение react должно работать с одним входом.как я могу этого добиться ?? пожалуйста, предоставьте решение для этого.
ниже приведен мой keycloak.json
{
"realm": "Google-Auth",
"auth-server-url": "http://localhost:8180/auth",
"ssl-required": "external",
"resource": "googledemo",
"public-client": true,
"confidential-port": 0
}
ниже secured.js
`import React, { Component } from 'react';
import UserInfo from './UserInfo';
import Logout from './Logout';
import Keycloak from 'keycloak-js';
class Secured extends Component {
constructor(props) {
super(props);
this.state = { keycloak: null, authenticated: false };
}
componentDidMount() {
const keycloak = Keycloak('/keycloak.json');
keycloak.init({onLoad: 'login-required'}).then(authenticated => {
this.setState({ keycloak: keycloak, authenticated: authenticated })
})
}
render() {
if(this.state.keycloak) {
if(this.state.authenticated) return (
<div>
<p>
This is a Keycloak-secured component of your application. You shouldn't be able to
unless you've authenticated with Keycloak.
</p>
<UserInfo keycloak={this.state.keycloak} />
<Logout keycloak={this.state.keycloak} />
</div>
); else return (<div>Unable to authenticate!</div>)
}
return (
<div>Initializing Keycloak...</div>
);
}
}
export default Secured;
Ответ №1:
Я сталкивался с подобным сценарием. Я также использовал тот же пакет keycloak-js. Вместо того, чтобы использовать это в компоненте, вы можете попытаться создать из него службу
import Keycloak from "keycloak-js";
const _kc = new Keycloak('/keycloak.json');
/**
* Initializes Keycloak instance and calls the provided callback function if successfully authenticated.
*
* @param onAuthenticatedCallback
*/
const initKeycloak = (onAuthenticatedCallback) => {
_kc.init({
onLoad: 'check-sso',
silentCheckSsoRedirectUri: window.location.origin '/silent-check-sso.html',
pkceMethod: 'S256',
})
.then((authenticated) => {
if (authenticated) {
onAuthenticatedCallback();
} else {
doLogin();
}
})
};
const doLogin = _kc.login;
const doLogout = _kc.logout;
const getToken = () => _kc.token;
const isLoggedIn = () => !!_kc.token;
const updateToken = (successCallback) =>
_kc.updateToken(5)
.then(successCallback)
.catch(doLogin);
const getUsername = () => _kc.tokenParsed?.preferred_username;
const hasRole = (roles) => roles.some((role) => _kc.hasRealmRole(role));
const UserService = {
initKeycloak,
doLogin,
doLogout,
isLoggedIn,
getToken,
updateToken,
getUsername,
hasRole,
};
export default UserService;
А затем используйте индекс, чтобы инициировать эту службу keycloak и передать визуализацию вашего приложения в качестве обратного вызова.
import React from "react";
import ReactDOM from "react-dom";
import App from "./components/App";
import HttpService from "./services/HttpService";
import UserService from "./services/UserService";
const renderApp = () => ReactDOM.render(<App/>, document.getElementById("app"));
UserService.initKeycloak(renderApp);
HttpService.configure();
Комментарии:
1.Это не ваш код. Кодовая база взята из: link
here
.2. В моем проекте (реакция, весенняя загрузка) Я должен поддерживать несколько серверов авторизации (например, KeyCloak, AWS Cognito, Okta) в зависимости от потребностей клиента. Уже реализована часть проверки токена доступа с поддержкой с помощью библиотеки spring (oauth2-resource-server), не используется зависимость от KeyCloak. Итак, для React есть ли способ использовать общую библиотеку для использования всех серверов авторизации, а не использовать конкретную библиотеку (KeyCloak). Существует ли какой-либо пакет npm для поддержки общей абстракции (для настройки client_id, secret …. для запуска страницы входа на сервер аутентификации и генерации токена доступа)?
3. Клиент будет использовать на сервере авторизации одновременно с приложением React и Spring boot. И к вашему сведению: мы не предоставляем социальные логины. Я должен ограничить роли пользователей в приложении, которое настроено на сервере аутентификации