首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用stormpath $http执行注销。

使用stormpath $http执行注销。
EN

Stack Overflow用户
提问于 2016-08-11 21:02:21
回答 1查看 109关注 0票数 1

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

代码语言:javascript
复制
    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端点的响应。

查看以下链接上的文档使我感到困惑。

  • http://docs.stormpath.com/nodejs/express/latest/logout.html
  • http://docs.stormpath.com/guides/token-management/

谢谢。

EN

回答 1

Stack Overflow用户

发布于 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,并让您的电子客户端在用户注销时使用它来撤销令牌:

代码语言:javascript
复制
'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发出删除请求:

N.html#revoking-访问和刷新-令牌

在这两种情况下,您将从您的服务器,而不是电子应用程序这样做。

我希望这能帮到你!

-Robert

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38906098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档