【问题标题】:Avoid keycloak callback process every time when refreshing page避免每次刷新页面时keycloak回调过程
【发布时间】:2020-12-07 13:48:38
【问题描述】:

我在我的 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"
});

每次我刷新页面时,它都会再次刷新(带有回调 url),并带有查询参数 statesession_statecode

例如: 当我转到该页面时:http://localhost:8080/test 它会去那里,但它会再次使用以下 url 刷新页面。

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

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

【问题讨论】:

    标签: javascript reactjs configuration keycloak


    【解决方案1】:

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

    在主要组件中:

    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;
    

    【讨论】:

    • 我会试试的,但是 LocalStore 和 ../utils/local_store.js 是什么?是本地存储吗?
    • LocalStore 只是一个封装 lockr 的工具,如果你想在本地存储中存储令牌,你可以使用 lockr 作为本地存储
    • 我已经尝试过您建议的解决方案,但对我来说它处于无限循环中(它一次又一次地刷新)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 2012-04-04
      • 2016-07-20
      • 2010-10-06
      相关资源
      最近更新 更多