我正在尝试使用stormpath API撤销oauth2令牌。使用stormpath + express执行服务器端身份验证。这是我的要求。
function revokeOauthTokens(params) {
// Revoke the oauth2 access. and refresh tokens
var oauthLogoutReq = {
method: 'POST',
url: params.apiBaseUrl + '/logout',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'grant_type=refresh_token&refresh_token='
+ params.oauth_tokens.refresh_token
}
return $http(oauthLogoutReq);
}
其中apiBaseUrl
是我的nodejs基本网址,ouath_tokens
包含请求授予/oauth/token
端点的响应。
查看以下链接的文档让我感到困惑。
感谢。
答案 0 :(得分:1)
这是一个很好的问题。正如您所见,express-stormpath使用安全的仅限http的cookie进行令牌存储,这对于Cordova,Electron等不起作用,其中cookie存储未实现到规范。另一种选择是本地存储,或者提供给您的其他一些存储API(希望是一个安全的存储API)。
express-stormpath库确实提供了/logout
路由,它确实撤销了令牌,但它正在寻找cookie中的令牌。我们需要添加一条新路由,可能是/oauth/revoke
,以支持显式令牌撤销。
现在很容易添加为自定义路由处理程序,我在下面添加了一个链接。但请注意, express-stormpath默认使用本地令牌验证。这是为了速度(没有往返我们的API),但需要注意的是,您的本地服务器不会知道令牌已被撤销,并且如果恶意第三方从您的客户端窃取它们,技术上仍然可以用于身份验证。如果这是您想要解决的问题,您应该选择加入stormpath
验证,这将始终需要检查我们的令牌数据库。这在此处记录:
http://docs.stormpath.com/nodejs/express/latest/authentication.html#token-validation-strategy
所有这一切,这里是您可以连接到/oauth/revoke
的路由处理程序,并让您的Electron客户端在用户注销时使用它来撤销令牌:
'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;
如果您发现您不想使用express-stormpath并希望使用更直接的内容,则可以下拉到Stormpath Node SDK并将其用于令牌撤销:
https://docs.stormpath.com/nodejs/jsdoc/AccessToken.html
或者您可以直接针对我们的API发出DELETE请求:
https://docs.stormpath.com/rest/product-guide/latest/auth_n.html#revoking-access-and-refresh-tokens
在这两种情况下,您都会从服务器而不是Electron应用程序中执行此操作。
我希望这有帮助!
-Robert