Express 使用stormpath$http执行注销
我正在尝试使用stormpath API撤销oauth2令牌。使用stormpath+express执行服务器端身份验证。这是我的要求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
函数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,它并不总是像常规浏览器那样工作。