我正在尝试使用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基url,ouath_tokens包含请求授予/oauth/token端点的响应。
查看以下链接上的文档使我感到困惑。
谢谢。
发布于 2016-08-16 16:27:36
这是个很好的问题。正如您所看到的,快捷存储路径正在使用安全的、只有http的cookie来进行令牌存储,而这并不适用于Cordova、Electron等,在那里,cookie存储没有实现到规范中。另一种选择是本地存储,或者提供给您的其他存储API (希望是安全的!)。
特快风暴路径库确实提供了一个/logout路由,它确实撤销了令牌,但它正在cookies中查找令牌。我们需要添加一个新的路由,可能是/oauth/revoke,以支持显式令牌撤销。
这现在很容易添加为自定义路由处理程序,我在下面包含了一个链接。但请注意,默认情况下,快速存储路径使用本地令牌验证。这样做是为了速度(不需要往返我们的API),但要注意的是,本地服务器将不知道令牌已被撤销,而且如果恶意第三方从客户端窃取了令牌,技术上仍然可以用于身份验证。如果这是您想要解决的问题,您应该选择加入stormpath验证,这总是需要对我们的令牌数据库进行检查。这里记录了这一点:
http://docs.stormpath.com/nodejs/express/latest/authentication.html#token-validation-strategy
尽管如此,这里有一个路由处理程序,您可以将其连接为/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;如果您发现不想使用速成存储路径,并且希望使用更直接的东西,您可以直接进入风暴路径节点SDK并使用它进行令牌撤销:
https://docs.stormpath.com/nodejs/jsdoc/AccessToken.html
或者您可以直接针对我们的API发出删除请求:
在这两种情况下,您将从您的服务器,而不是电子应用程序这样做。
我希望这能帮到你!
-Robert
https://stackoverflow.com/questions/38906098
复制相似问题