避免每次刷新页面时keycloak回调过程

问题描述 投票:0回答:4

我在我的 React 应用程序中使用了 keycloak 作为身份提供者。我已经使用 npm 在我的 React 应用程序中安装了 keycloak React 依赖项。

以下是依赖的 keycloak React npm 模块及其版本:

“@react-keycloak/web”:“2.1.4”,
“keycloak-js”:“^11.0.2”,

我提供了 keycloak 配置如下:

const keycloak = new Keycloak({
  realm: "temp-local",
  url: " http://localhost:8090/auth/",
  clientId: "temp-local-client"
});

每次刷新页面时,它都会使用查询参数 statesession_statecode 再次刷新(使用回调 url)。

例如: 当我转到页面:http://localhost:8080/test 时,它会转到那里,但它会再次刷新具有以下网址的页面。

示例网址:http://localhost:8080/test#state=45ert45-edac92ddbf2a&session_state=45ga97bbfb4-f080cvb65e59b&code=1a1a-4e6e-3fg578-4fg10b-bbafg8-652f g6c44727a4

如何避免keycloak刷新?有人对此有任何想法吗?

javascript reactjs configuration keycloak
4个回答
4
投票

我也遇到过这个问题,对我有帮助的是使用静默检查 SSO:


  • index.html
    旁边添加一个名为
    silent-check-sso.html
    的文件,其中包含以下内容:
<html><body><script>parent.postMessage(location.href, location.origin)</script></body></html>
  • <ReactKeycloakProvider>
    更新您的
    initOptions
    ,例如:
    <ReactKeycloakProvider
      authClient={keycloak}
      initOptions={{
        onLoad: 'check-sso',
        silentCheckSsoRedirectUri: window.location.origin + '/silent-check-sso.html',
        pkceMethod: 'S256',
      }}
    >
    ...
    </ReactKeycloakProvider>

不幸的是,我不知道它如何工作的技术细节(欢迎解释评论),但它帮助了我:] 以下是它如何在没有静默检查 SSO 的情况下工作:

enter image description here

这是静默检查 SSO 的情况:

enter image description here

希望有帮助!


0
投票

有同样的问题,对我来说我是这样解决的:

在主要组件中:

const App = () => {
    //here i'm using redux, btw i'm initializing this auth component
    useEffect(() => auth.init(store.dispatch), [])

身份验证组件:

import Keycloak from 'keycloak-js';
const keycloak = Keycloak('/keycloak.json');
import axios from 'axios'
import { LocalStore } from '../utils/local_store.js'

const store_token = (token) => {
    axios.defaults.headers.Authorization = `Bearer ${token}`;
    LocalStore.set('token', token);
}

const auth = {
    init(dispatch) {


        keycloak.init({ onLoad: 'login-required', checkLoginIframe: false, }).then(() => {
            store_token(keycloak.token)
            dispatch(authenticateResponse(keycloak.token)).then(
                () => {
                   //auth logic
                }
            );

            //this is my fix
            setInterval(() => {
                keycloak.updateToken(70).then((refreshed) => {
                    if (refreshed) {
                        store_token(keycloak.token)
                        console.debug('Token refreshed');
                    } else {
                        console.warn('Token not refreshed');
                    }
                }).catch(() => {
                    console.error('Failed to refresh token');
                });
            }, 50000)

        }).catch(() => {
            console.error('Auth failed');
        });
    },
    keycloak() {
        return keycloak;
    }
}


export default auth;

0
投票

检查代码的其他部分是否在react-router中进行重定向: 我遇到了同样的问题,但是在大型代码库中,其他错误(由于缺少令牌)导致内部重定向到登录路由


0
投票

你只需要在初始化函数中使用

checkLoginIframe: false

const keycloak = new Keycloak({
  realm: "temp-local",
  url: " http://localhost:8090/auth/",
  clientId: "temp-local-client",
  checkLoginIframe: false
});
© www.soinside.com 2019 - 2024. All rights reserved.