Express 使用stormpath$http执行注销

Express 使用stormpath$http执行注销,express,stormpath,Express,Stormpath,我正在尝试使用stormpath API撤销oauth2令牌。使用stormpath+express执行服务器端身份验证。这是我的要求 函数revokeAuthTokens(参数){ //撤销oauth2访问权限。并刷新令牌 变量oauthLogoutReq={ 方法:“POST”, url:params.apiBaseUrl+'/logout', 标题:{ “内容类型”:“应用程序/x-www-form-urlencoded” }, 数据:'grant\u type=refresh\u-to

我正在尝试使用stormpath API撤销oauth2令牌。使用stormpath+express执行服务器端身份验证。这是我的要求

函数revokeAuthTokens(参数){
//撤销oauth2访问权限。并刷新令牌
变量oauthLogoutReq={
方法:“POST”,
url:params.apiBaseUrl+'/logout',
标题:{
“内容类型”:“应用程序/x-www-form-urlencoded”
},
数据:'grant\u type=refresh\u-token&refresh\u-token='
+params.oauth_令牌。刷新_令牌
}
返回$http(oauthlogutreq);

}
这是一个很好的问题。正如您所看到的,express stormpath正在使用安全的、仅http的cookie来进行令牌存储,但这不适用于Cordova、Electron等,因为它们的cookie存储未按规范实施。另一种选择是本地存储,或提供给您的其他存储API(希望是安全的!)

express stormpath库确实提供了一个
/logout
路由,它确实撤销令牌,但它正在cookie中查找令牌。我们需要添加一个新路由,可能是
/oauth/revoke
,以支持显式令牌撤销

这是一个非常容易添加的自定义路由处理程序,我在下面包含了一个链接。但请注意,express stormpath默认使用本地令牌验证。这样做是为了提高速度(不需要往返于我们的API),但需要注意的是,您的本地服务器不会知道令牌已被吊销,而且从技术上讲,如果恶意第三方从您的客户端窃取了令牌,则仍可将其用于身份验证。如果这是您想要解决的问题,您应该选择
stormpath
验证,这将始终需要对我们的令牌数据库进行检查。这里记录了这一点:

综上所述,以下是路由处理程序,您可以将其连接为
/oauth/revoke
,并让您的电子客户端在用户注销时使用它来撤销令牌:

'use strict';

var revokeToken = require('express-stormpath/lib/helpers/revoke-token');

function defaultResponder(res, err) {
  if (err) {
    console.error(err); // or your system logger
    return res.status(err.status || 400).json({
      message: err.developerMessage || err.message
    });
  }
  res.end();
}

/**
 * Implements the expected behavior of the /oauth/revoke endpoint, and requires
 * that token_type be defined.  This assumes that you are using the express-stormpath
 * module, so that your Stormpath client and configuration context is available.
 *
 * @param {Object<ExpressRequest>}  req     Express JS Request
 * @param {Object<ExpressResponse>} res     Express JS Response
 */
function revokeTokens(req, res){

  var client = req.app.get('stormpathClient');
  var config = req.app.get('stormpathConfig');
  var secret = config.client.apiKey.secret;
  var token = req.body.token;
  var token_type = req.body.token_type;

  if (!token || ! token_type) {
    defaultResponder(res, {
      message: 'token and token_type fields are required'
    });
  }

  if (token_type === 'access_token') {
    revokeToken.revokeAccessToken(client, token, secret, defaultResponder.bind(null, res));
  } else if (token_type === 'refresh_token') {
    revokeToken.revokeRefreshToken(client, token, secret, defaultResponder.bind(null, res));
  } else {
    defaultResponder(res, {
      message: 'invalid token_type'
    });
  }
}


module.exports = revokeTokens;
“严格使用”;
var revokeToken=require('express-stormpath/lib/helpers/revokeToken');
函数defaultResponder(res,err){
如果(错误){
console.error(err);//或您的系统记录器
返回res.status(err.status | | 400).json({
消息:err.developerMessage | | err.message
});
}
res.end();
}
/**
*实现/oauth/revoke端点的预期行为,并需要
*无法定义该令牌类型。这假设您正在使用快速风暴路径
*模块,以便您的Stormpath客户端和配置上下文可用。
*
*@param{Object}req Express JS请求
*@param{Object}res Express JS响应
*/
函数撤销令牌(req、res){
var client=req.app.get('stormpathClient');
var config=req.app.get('stormpathConfig');
var secret=config.client.apiKey.secret;
var token=req.body.token;
var token_type=req.body.token_type;
如果(!令牌| |!令牌|类型){
默认响应程序(res{
消息:“需要令牌和令牌类型字段”
});
}
如果(令牌\u类型==='访问\u令牌'){
revokeToken.revokeAccessToken(客户端、令牌、机密、defaultResponder.bind(null、res));
}else if(令牌\u类型==='刷新\u令牌'){
revokeToken.revokeRefreshToken(客户端、令牌、机密、defaultResponder.bind(null、res));
}否则{
默认响应程序(res{
消息:“无效的令牌类型”
});
}
}
module.exports=撤销代币;
如果您发现您不想使用express stormpath,并且希望使用更直接的方式,您可以下拉到并将其用于令牌吊销:

或者,您可以直接针对我们的API发出删除请求:

在这两种情况下,您都可以从服务器而不是电子应用程序执行此操作

我希望这有帮助


-罗伯特

你好!我在这里工作,所以我当然可以在这里帮忙。您能告诉我您是否正在使用我们的
express stormpath
库(该库通过cookies管理令牌),或者您是否正在更直接地集成,例如,手动创建令牌与stormpath提供的/oauth/token端点?谢谢我正在通过oauth/tokens手动创建令牌。感谢更新!我必须向您展示如何使用一个代码示例来实现这一点,我现在正在编写一个代码示例。准备好后我会继续回答。我的后端基于express stormpath。但是我也使用oauth2令牌进行了很多API调用,我想直接撤销它们的访问。我知道express library通过cookies管理代币,但这种方法在我的情况下是不可行的,因为我的前端基于electron.io,它并不总是像常规浏览器那样工作。