首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Salesforce注册页面与VanillaJS oidc-client-js集成,获取存储中的错误-没有匹配状态。

将Salesforce注册页面与VanillaJS oidc-client-js集成,获取存储中的错误-没有匹配状态。
EN

Stack Overflow用户
提问于 2020-06-15 05:21:43
回答 1查看 234关注 0票数 0

将Salesforce注册页面与VanillaJS集成,获取存储中的错误-没有匹配状态

当创建帐户按钮时,我们将用户重定向到Salesforce注册页面。一旦用户在Salesforce注册,用户就被重定向到我们的站点,但是我们得到了这个错误。(“在存储中没有找到匹配状态”)。

我们尝试了下面的解决方案,但仍然得到了相同的错误。

正如我在回答中所述,oidc客户端在本地存储中维护状态信息,以便验证它是否从预期的服务器获得响应。您可以通过生成一个安全的随机字符串并将其保存在localStorage中来模仿它。在向您的auth服务器发送注册新用户的请求之前,请执行此操作。

参考- Integrate third party login in from my registration page with IdentityServer4 and Angular 6 - 'No matching state found in storage'

是否有与创建注册相关的功能?如何解决这个问题?

谢谢。感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-22 19:33:13

在这个问题上花了几天时间。最后找到了解决办法,因为注册不是OIDC的一个特性。

为了克服这一问题,需要在进程中遵循与注册过程相同的符号,创建与startSigninMainWindow相同的startSigninMainWindow方法,并传递signUpFlag:true,如下所示,代码如下所示。

代码语言:javascript
复制
/* 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。

代码语言:javascript
复制
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);
  }
})

下面的代码是用代码编写的寄存器函数。

代码语言:javascript
复制
/* 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");
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62381806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档