如何使用 express-stormpath 和 stormpath-sdk-angularjs 注销 Stormpath ID 站点?

How do I log out of Stormpath ID Site with express-stormpath and stormpath-sdk-angularjs?

我有一个使用 Stormpath ID 站点的 express-stormpath 应用程序。它有这样的配置:

app.use(stormpath.init(app, {
  web: {
    idSite: {
      enabled: true,
      uri: '/idSiteResult',
      nextUri: '/'
    },
    login: {
      enabled: true,
      uri: config.login
    },
    logout: {
      enabled: true,
      uri: config.logout
    },
    me: {
      expand: {
        customData: true,
        groups: true
      }
    }
  }
}));

登录正常,但注销给我带来麻烦。

首先,我尝试使用 stormpath-sdk-angularjs 内置的 endSession()

注销
$auth.endSession();

但我仍然登录。

深入研究 express-stormpath,它看起来像 logout POST requires Accept type text/html for id-site logout. In stormpath-sdk-angularjs, it looks like endSession POST uses application/json

所以我尝试使用 $http.post

注销
$http.post('/logout', null, {
  headers: {
    'Accept': 'text/html'
  }
});

但是我得到这个错误:

XMLHttpRequest cannot load https://api.stormpath.com/sso/logout?jwtRequest=[...]. Redirect from 'https://api.stormpath.com/sso/logout?jwtRequest=[...]' to 'http://localhost:9000/idSiteResult?jwtResponse=[...]' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access.

如何退出 Stormpath ID 站点?

这看起来像是一个 CORS 问题。我相信您至少需要添加;

Access-Control-Allow-Origin: https://api.stormpath.com

来自您的服务器的响应 headers。

我在 Stormpath 工作。 ID 站点要求您实际将最终用户重定向到 ID 站点。我不确定为什么 endSession() 不起作用,但我会联系我们的 JS 团队,看看那里是否存在错误。

同时,您可以使用此代码(或 Angular 特定原语中的等效代码)完成注销:

var form = document.createElement('form');
form.method = "POST";
form.action = "/logout";
form.submit();