Приложение OAuth 2.0 на NodeJS
предупреждение
Если Вы разрабатываете SPA, мобильное или нативное приложение — убедитесь, что можете обеспечить конфиденциальность Client Secret.
Подробнее о причинах — в документации OAuth.
подсказка
Данная страница содержит только образец кода OAuth-клиента. Подробнее о способе авторизации через OAuth-сервис читайте в соответствующей статье.
const cors = require('cors'),
express = require('express'),
app = express(),
simpleOAuth = require('simple-oauth2');
const credentialsInvia = {
client: {
// Параметры ниже заполняются значениями из https://devs.inviabroker.com/myapps
// Идентификатор приложения. Считается публичной информацией
id: 'd8d...ce7',
// Секретный ключ приложения. Считается приватной информацией
secret: '4s7...40=',
},
auth: {
// Адрес сервера авторизации боевого контура. Для тестового контура используйте https://oauthdev.inviabroker.com
tokenHost: 'https://oauth.inviabroker.com',
// Адрес ресурса, к которому клиентское приложение направит пользователя для ввода его учётных данных
authorizePath: '/authorize',
// Адрес ресурса, к которому клиентское приложение будет обращаться для генерации токенов при успешной авторизации пользователя
tokenPath: '/token',
}
};
const OAuth2 = simpleOAuth.create(credentialsInvia);
// CORS на все домены. По необходимости удалите или настройте
app.use(cors());
app.get('/', function (req, res) {
let state = '';
const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for (let i = 0; i < 15; i++) {
state += possible.charAt(Math.floor(Math.random() * possible.length));
}
authorization_uri = OAuth2.authorizationCode.authorizeURL({
// Адрес страницы клиентского приложения, на которую пользователь будет перенаправлен после успешной авторизации
// Адрес должен совпадать с указанным на странице https://devs.inviabroker.com/myapps
redirect_uri: 'https://localhost:3001/callback',
// Перечень разрешений, запрашиваемых приложением по умолчанию
// Пользователь может изменить список фактически предоставленных приложению разрешений на странице авторизации
scope: 'ordersread trades personal trades',
// Состояние, с помощью которого вы сможете определить клиента вернувшегося по редиректу
state
});
const tpl = `
<html>
<body>
<h4>Ouath client app example</h4>
<a href="${authorization_uri}">Connect to Инвиа</a>
</body>
</html>
`;
res.send(tpl);
});
// Колбэк, который получает токены по коду авторизации
app.get('/callback', async function (req, res) {
if(req.query.error){
res.send(req.query.error);
return;
}
const code = req.query.code;
const tokenConfig = {
code,
redirect_uri: 'https://localhost:3001/callback',
client_id: credentialsInvia.client.id,
client_secret: credentialsInvia.client.secret
};
try {
const result = await OAuth2.authorizationCode.getToken(tokenConfig);
const tokenResp = OAuth2.accessToken.create(result);
const tpl = `
<html>
<body>
<h4>Ouath client app example</h4>
<div><b>Success</b></div>
<div>Acess Token: ${tokenResp.token.access_token}</div>
<div>Refresh Token: ${tokenResp.token.refresh_token}</div>
</body>
</html>
`;
res.send(tpl);
} catch (error) {
res.send('Access Token Error', error.message);
}
});
app.listen(3001);
console.log('OAuth Client started on port 3001');