来这里寻求一些非常需要的帮助。我们有一个非常独特的使用keycloak进行身份验证的场景。我们的要求如下:
- “Parital”身份验证流,其中后端创建一个keycloak用户,并将该用户的
access_token
/refresh_token
返回给我们的react前端(使用keycloak-js
) - 标准的keycloak身份验证流程,用户通过keycloak登录页面进行身份验证,并愉快地返回到我们的应用程序(这工作正常,正如预期的那样!)
正如你所想象的,第一点就是我们的麻烦所在,每当我试图手动为keycloak示例设置令牌并刷新令牌时,调用都因为400 bad request
而无法进行keycloak,这是由于请求负载未定义,尽管示例属性(keycloak.accessToken
,keycloak.refreshToken
已填充):
grant_type: refresh_token
refresh_token: undefined
client_id: frontend
对于实现可视化,我使用了@dasniko Niko Köbler Implementation作为起点,但我只是为令牌添加了一个setter:
import kc from 'keycloak';
const doLogin = kc.login;
const initKeycloak = (onAuthenticatedCallback: () => void) => {
kc.init({
onLoad: 'check-sso',
pkceMethod: 'S256',
enableLogging: true,
}).then((authenticated: boolean) => {
if (!authenticated) {
console.log('user is not authenticated..!');
}
onAuthenticatedCallback();
});
};
const setTokens = (access: string, refresh: string): void => {
kc.token = access;
kc.refreshToken = refresh;
};
const doLogout = kc.logout;
const getToken = () => kc.token;
const isLoggedIn = () => !!kc.token;
const updateToken = (successCallback: () => void) =>
kc.updateToken(5)
.then(successCallback)
.catch(doLogin);
我还以类似的方式设置了令牌刷新实现:
axios.interceptors.request.use((config: any) => {
if (AuthService.isLoggedIn()) {
const cb = () => {
config.headers.Authorization = `Bearer ${AuthService.getToken()}`;
return Promise.resolve(config);
};
return AuthService.updateToken(cb);
}
return config;
});
有没有人成功地尝试了上面的方法?手动设置keycloak令牌,而不是让用户先通过keycloak登录?
1条答案
按热度按时间ygya80vv1#
您不需要手动设置令牌。
您是否可能在不同的域中安装了应用程序和keycloak示例?潜在问题可能与CORS策略设置或阻止keycloak Cookie的第三方Cookie/反跟踪软件相关。
测试时,你可以试着禁用你的反广告/追踪软件,或者使用不同的浏览器,如果可以的话,比如firefox可能可以,而chrome有更严格的默认设置。
要解决实际问题,请确保
更多信息,请访问: