将Salesforce注册页面与VanillaJS集成,获取存储中的错误-没有匹配状态
当创建帐户按钮时,我们将用户重定向到Salesforce注册页面。一旦用户在Salesforce注册,用户就被重定向到我们的站点,但是我们得到了这个错误。(“在存储中没有找到匹配状态”)。
我们尝试了下面的解决方案,但仍然得到了相同的错误。
正如我在回答中所述,oidc客户端在本地存储中维护状态信息,以便验证它是否从预期的服务器获得响应。您可以通过生成一个安全的随机字符串并将其保存在localStorage中来模仿它。在向您的auth服务器发送注册新用户的请求之前,请执行此操作。
是否有与创建注册相关的功能?如何解决这个问题?
谢谢。感谢你的帮助。
发布于 2020-06-22 19:33:13
在这个问题上花了几天时间。最后找到了解决办法,因为注册不是OIDC的一个特性。
为了克服这一问题,需要在进程中遵循与注册过程相同的符号,创建与startSigninMainWindow相同的startSigninMainWindow方法,并传递signUpFlag:true,如下所示,代码如下所示。
/* This function is written to mimic the oidc library sign in process flow */
function startSignupMainWindow() {
var someState = {
message: window.location.href,
signUpFlag: true
};
mgr.signinRedirect({
state: someState,
useReplaceToNavigate: true
}).then(function() {
log("signinRedirect done");
}).catch(function(err) {
log(err);
});
}在UserManager.js中读取signUpFlag:true,并使用注册页面Url交换页面url中的Salesforce符号,并在代码中调用Register。
UserManager.js(oidc - client - dev - js / src / UserManager.js)
//UserManager Customised Code :
return this.createSigninRequest(args).then(signinRequest => {
Log.debug("UserManager._signinStart: got signin request");
navigatorParams.url = signinRequest.url;
navigatorParams.id = signinRequest.state.id;
if (signinRequest.state._data.signUpFlag) {
register(signinRequest.state._id, signinRequest.state._code_challenge);
} else {
return handle.navigate(navigatorParams);
}
})下面的代码是用代码编写的寄存器函数。
/* This function is written to send the code_challenge to salesforce server so that
salesforce server holds the code challenge and used to verify the further requests(token-request)
against the code_challenge it received initially.*/
//Customised register function written outside the library (Inside our App):
function register(_id, code_challenge) {
var date = new Date();
var baseUrl = "SALESFORCE_URL/login/SelfRegister?expid=id";
var expId = "id";
var userPage = encodeURIComponent(window.location.href);
var appDetails = "response_type=code&" +
"client_id=CLIENT_ID" +
"client_secret=CLIENT_SECRET&" +
"redirect_uri=CALLBACK_URL&" +
"state=" + _id + "&code_challenge=" + code_challenge + "&code_challenge_method=S256&response_mode=query";
var encodedapp = encodeURIComponent(appDetails);
var startUrl = "/services/oauth2/authorize/expid?" + encodedapp;
var signUpUrl = baseUrl + "&startURL=" + startUrl;
window.open(signUpUrl, "_self");
};https://stackoverflow.com/questions/62381806
复制相似问题