2016-08-11 5 views
1

Я пытаюсь отозвать маркеры oauth2 с помощью API штурма. Аутентификация на стороне сервера выполняется с помощью шунтирования + экспресс. Вот моя просьба.

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 конечной точке.

Рассмотрение документации по следующим ссылкам оставляет меня в замешательстве.

Спасибо.

+0

Привет! Я работаю в [Stormpath] (https://stormpath.com), поэтому могу, конечно, помочь здесь. Можете ли вы сказать мне, используете ли вы библиотеку 'express-stormpath' (которая управляет токенами через файлы cookie) или если вы интегрируете более непосредственно, например вручную создаете токены с конечной точкой/oauth/token, предоставляемой Stormpath? Благодаря! – robertjd

+0

Я вручную создаю токены через oauth/tokens. –

+0

Спасибо за обновление! Я должен показать вам, как это сделать с образцом кода, который я собираю сейчас. Я отвечу на ответ, когда будет готов. – robertjd

ответ

1

Это отличный вопрос. Как вы видели, express-stormpath использует безопасные, только http-файлы cookie для хранения токенов, и это не работает для Cordova, Electron и т. Д., Где хранилище cookie не реализовано в спецификации. Альтернативой является локальное хранилище или какой-либо другой API хранения, который предоставляется вам (надеюсь, это безопасный!).

Библиотека экспресс-шторма предоставляет маршрут /logout, и он отменяет токены, но ищет маркеры в куки. Нам нужно добавить новый маршрут, вероятно, /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; 

Если вы обнаружите, что вы не хотите использовать экспресс-stormpath и хотели бы использовать что-то более прямое, вы можете опуститься до Stormpath Node SDK и использовать его для маркеров отзыва:

https://docs.stormpath.com/nodejs/jsdoc/AccessToken.html

Или вы можете сделать DELETE запросы непосредственно против нашего API:

https://docs.stormpath.com/rest/product-guide/latest/auth_n.html#revoking-access-and-refresh-tokens

В обоих случаях вы будете делать это с вашего сервера, а не приложение Electron.

Надеюсь, это поможет!

-Robert

 Смежные вопросы

  • Нет связанных вопросов^_^