client-socket-nodejs
v2.0.7
Published
Client socket in nodejs for proxy authenticateion of resource server
Downloads
16
Readme
1. Install
npm i client-socket-nodejs cng-node-js-utils
2. Create key pair for this client before do anything follow:
// import
const { ClientDeviceInfo } = require("client-socket-nodejs").socket;
let appName = "TEST";
let deviceKey = {
// copy in this area for keyPair will been created for save
}
/**
* define app key by app_app name:
*/
let clientDeviceInfo = new ClientDeviceInfo(appName, deviceKey);
clientDeviceInfo.getClientInfo()
.then(deviceInfo => {
console.log('deviceInfo: ', deviceInfo);
console.log('Key pair created:', clientDeviceInfo.getKeyPair())
})
.catch(err => {
console.log('Error for create key: ', err);
});
3. Register user in socket user follow:
const { ClientSocket, ClientDeviceInfo } = require("client-socket-nodejs").socket;
let appName = "TEST"; // appName for resource server
let deviceKey = {
// copy key pair in step 2 in here
id: 'public_key',
key: 'private_key',
created_time: 'create_time format ISO yyyy-mm-dd hh:mi:ss'
}
/**
* define app key by app_app name:
*/
let clientDeviceInfo = new ClientDeviceInfo(appName, deviceKey);
// Pass for user
let pass = 'passForUser';
let expired = 365;
let isDebug = true;
// define link for connect
let socketLink = {
url: "http://localhost:9225"
, path: "/socket"
, timeout: 10000
}
// define user for reqister
let loginUser = {
username: 'phoneNumberOrEmail', // 'phone or email
user_type: 'emal', // 'phone' | 'email' | 'ldap'
}
// define user info for reqister
let userInfo = {
nickname: "NickName Demo"
, fullname: "The name of this app for description"
, address: "Address for this server"
, phone: "Phone number"
, email: "Email of this user"
, avatar: 'Link of avatar'
, background: 'Link of background'
}
// define one socketClient follow:
let clientSocket = new ClientSocket(clientDeviceInfo, loginUser, userInfo, pass, expired, isDebug);
// init connection to server for register user
clientSocket.init(socketLink.url, socketLink.path, socketLink.timeout)
// Waiting for token response from server:
const { waiting } = require("cng-node-js-utils")
waiting(20000, { hasData: () => clientSocket.getToken() })
.then(msg => {
// View token valid and copy to token for save step 4:
console.log("***>Current TOKEN connected: ", clientSocket.getToken());
})
4. Login by user for token if token expire
const { ClientSocket, ClientDeviceInfo } = require("client-socket-nodejs").socket;
let appName = "TEST"; // appName for resource server
let deviceKey = {
// copy key pair in step 2 in here
id: 'public_key',
key: 'private_key',
created_time: 'create_time format ISO yyyy-mm-dd hh:mi:ss'
}
/**
* define app key by app_app name:
*/
let clientDeviceInfo = new ClientDeviceInfo(appName, deviceKey);
// Pass for user
let pass = 'passForUser';
let expired = 365;
let isDebug = true;
// define link for connect
let socketLink = {
url: "http://localhost:9225"
, path: "/socket"
, timeout: 10000
}
// define user for reqister
let loginUser = {
username: 'phoneNumberOrEmail', // 'phone or email
user_type: 'emal', // 'phone' | 'email' | 'ldap'
}
// define user info for reqister
let userInfo; // no need to define;
// define one socketClient follow:
let clientSocket = new ClientSocket(clientDeviceInfo, loginUser, userInfo, pass, expired, isDebug);
// init connection to server for register user
clientSocket.init(socketLink.url, socketLink.path, socketLink.timeout)
// Waiting for token response from server:
const { waiting } = require("cng-node-js-utils")
waiting(20000, { hasData: () => clientSocket.getToken() })
.then(msg => {
// View token valid and copy to token for save step 4:
console.log("***>Current TOKEN connected: ", clientSocket.getToken());
})
5. Init socket connection with token
// define class for socket
const { ClientSocket, ClientDeviceInfo } = require("../socket");
let appName = "TEST"; // appName for token register in step 3:
let deviceKey = {
// copy key pair in step 2 in here
id: 'public_key',
key: 'private_key',
created_time: 'create_time format ISO yyyy-mm-dd hh:mi:ss'
}
let token = "copy Token in step 3 in here";
/**
* define app key by app_app name:
*/
let clientDeviceInfo = new ClientDeviceInfo(appName, deviceKey, token);
// define one socketClient follow:
let clientSocket = new ClientSocket(clientDeviceInfo, loginUser, userInfo, pass, expired, isDebug);
// init connection to server for register user
clientSocket.init(socketLink.url, socketLink.path, socketLink.timeout)
// Waiting for token response from server:
const { waiting } = require("cng-node-js-utils")
waiting(20000, { hasData: () => clientSocket.getToken() })
.then(msg => {
// View token valid and copy to token for save step 4:
console.log("***>Current TOKEN connected: ", clientSocket.getToken());
})
6. Make proxy authentication server socket
npm i client-socket-nodejs
6.1 create key pair for this server
6.2 register new user (ask admin socket server)
6.3 login and get token with expired date
6.4 copy keyPair and token follow file config socketVerify
6.5 create handler for verify token in
./handler/client-socket/socket-verify.js
or any for secret token and private_key for this server:
/**
* Hàm này giao tiếp khởi tạo client Handler giao tiếp máy chủ socket để verify token và get user từ socket server
* Điều kiện là máy này đã thiết lập được kênh liên lạc với máy chủ socket rồi
* Được cấp token có hiệu lực rồi
*/
// test thử kênh liên lạc với máy chủ sau khi đã đăng ký được token
const { ClientSocket, ClientDeviceInfo, ClientHandler } = require("client-socket-nodejs");
let appName = "TEST"; // tên này phải trùng với tên khi cấp token đó
// PHẦN ĐƯỢC TẠO bởi client:
// sử dụng test/create-key-pair.js để tạo key trước, sau đó copy khóa đó vào dưới đây
let deviceKey = {
id: 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMYLyjaOwTyajv1GMlBVim70bw4DUERzHhqobvN+2As8j7qGTNNl7FoZjCRMeVJcvLSerpCT+RWA695bmLv91RcCAwEAAQ==',
key: 'MIIBOwIBAAJBAMYLyjaOwTyajv1GMlBVim70bw4DUERzHhqobvN+2As8j7qGTNNl7FoZjCRMeVJcvLSerpCT+RWA695bmLv91RcCAwEAAQJAA80yIn33A5zL5dy1Fomt0Jdskk5J+iZji4t0JcRnjT+hsKroIjwVNS9z58MXmwI1u/s3WljkAGTLvOjepMlPYQIhAPDeu1YxUS7QAg0VtaCwm1R6sxs4Fub+pcbvYrOf+s8fAiEA0nxvOfZI8wE0/CoP2j1D5sNKinsImVt52HpyrWvK0wkCIQDKWzSjWtdLLrEqcPyfvP8h39ssmNiUw4ZeNKqFIXfCHQIgfyr03DUDL+XbyDn1Z+o52vLEV1QsBtNwkyyvmj0UxlkCIQCC43kV/Jc6FegQd/IZFE4YnGaqSii+y2/gz2O6xpGnjQ==',
created_time: '2020-09-12 09:02:09'
}
// PHẦN ĐƯỢC TẠO bởi server socket:
// token cho máy chủ cuongdq:
let token = "eyJ1c2VybmFtZSI6IjA5MDM1MDAxMjUiLCJkZXZpY2VfaWQiOjE1LCJpYXQiOjE1OTk4ODM4NDY2OTQsImV4cCI6MTYzMTQxOTg0NjY5NH0=.WlJGaDdDYkhFOWczZXdXdVdvOUsrV2NjV2U5bVBtTlRtKzI2WGw0Vi9leDZzWjkwcmVEOGlsMHNUazlFTXVxTC9DTFk0b3BSWHdtOVJ4V2t2a1ZoUHc9PQ==";
// nếu ta cấp token và deviceKey thì thông tin user có thể bỏ qua
let clientDeviceInfo = new ClientDeviceInfo(appName, deviceKey, token);
let socketLink = {
url: "http://localhost:9225"
, path: "/socket"
, timeout: 10000
}
// byPASS for check
let byPass = true; // for false if advance user to get user info from socket server
let clientSocket = new ClientSocket(clientDeviceInfo);
clientSocket.init(socketLink.url, socketLink.path, socketLink.timeout)
const clientHandler = new ClientHandler(clientSocket, socketLink.url, socketLink.path, byPass)
module.exports = {
verifyToken: clientHandler.verifyToken,
getResource: clientHandler.getResource
}
- 6.6 in any routes for verify token by socket proxy
// processor for getToken + post json_data + post form_data
const { postHandler } = require("cng-node-js-utils")
// processor for verify token, return: req.user if success or req.error if fail
const socketVerify = require("../../handlers/client-socket/socket-verify")
7. Javascript package for login form:
# install key
npm i client-socket-nodejs@latest
# create new KEYPAIRs for your app
node ./client-socket-nodejs/test/create-key-pair.js
// import lib
const { ClientInputInterface } = require("client-node-js");
// copy keypairs when you create here:
const deviceKey = {
// copy keyPair here
}
// Define your app name
const APP_NAME = "WEB-DEMO";
// Define device class with appname and keypair
let clientDeviceInfo = new ClientDeviceInfo(APP_NAME, deviceKey);
// define link to server (ask your admin socket Server for link)
const socketLink = {
url: "http://localhost:9225"
, path: "/socket"
, timeout: 10000
}
// ask for admin socket server for user init no pass in server database
// Define client
let client = new ClientInputInterface(APP_NAME, deviceKey, socketLink);
const { waiting } = require("cng-node-js-utils");
// if token saved
let myToken =
"yourtoken.yoursign";
// login BY Token
client
.loginByToken(myToken)
.then((data) => {
console.log("data", data);
})
.catch((err) => {
console.log("err", err);
});
// login by USER form
// const loginForm = {
// username: "yourEmail@email", // 'phone or email
// user_type: "email", // 'phone' | 'email' | 'ldap'
// password: "xxxx",
// expired: 365,
// };
// client
// .loginByUser(
// loginForm.username,
// loginForm.user_type,
// loginForm.password,
// loginForm.expired
// )
// .then((data) => {
// console.log("LoginData", data);
// })
Login IN WEB default index.html
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- <script src="https://cuongdq.no-ip.info/socket/api/js/www.client.socket.login.js"></script> -->
<script src="./www.client.socket.login.js"></script>
<script>
// app demo
const APP_NAME = "WEB-DEMO-CUONGDQ";
// Key demo
const deviceKey = {
created_time: "2020-09-17 22:25:09",
id: "MFswDQYJKoZIhvcNAQEBBQADSgAwRwJAea/IOT6QMv/kw1W8aYzlIG/twyKmjYggL94DbduYC8t7QmZ0JCpK43ugArxzVmXnAU6oe0wiuH57yS4cKLntUQIDAQAB",
key: "MIIBOQIBAAJAea/IOT6QMv/kw1W8aYzlIG/twyKmjYggL94DbduYC8t7QmZ0JCpK43ugArxzVmXnAU6oe0wiuH57yS4cKLntUQIDAQABAkA/81ucif6qbsVAyuwL5Jn95BTmOm2hb+rKfTj8IS3U9EjAMs4ppC79uIMGL8zAQiftY2DOs/QFPgBlHRYBGGlhAiEA6Ar9ZB/Jk/jRvsXfrlbNog95AQrXSsv7ydvsUh9sqrUCIQCGQAVXdSzYBeLaodpatYrrLMRRwOc6iH6rTaYypN3trQIhALhfKxEoNLnPRZEIln9m10MCekn6vC/hPnIYvYBPGb/VAiAHzXbCA4RstcLelCOdvAlr67kpSz3lMAO0rxmmveBMLQIgQx8NQrTVAWvHghZEqEmy/1IAKaziMf4FQQgPt0UGAcc="
};
// socket server link
const socketLink = {
url: "http://localhost:9225",
path: "/socket",
timeout: 10000,
};
// key pair auto:
// let clientDeviceInfo = new clientSocketLogin.ClientDeviceInfo();
// clientDeviceInfo.getClientInfo()
// .then(deviceInfo => {
// // console.log('deviceInfo: ', deviceInfo);
// console.log('KeyPair:', clientDeviceInfo.getKeyPair())
// })
// .catch(err => {
// console.log('Error: ', err);
// });
let client = new clientSocketLogin.ClientInputInterface(APP_NAME, deviceKey, socketLink);
// check device ready (socket communicated with server)
client.getDeviceId()
.then(deviceId => {
console.log('The device ready: ', deviceId);
})
// token saved
let myToken =
"xeyJ1c2VybmFtZSI6ImN1b25nLmRxIiwiZGV2aWNlX2lkIjozMSwiaWF0IjoxNjAwMzM3NzU4MzI1LCJleHAiOjE2MzE4NzM3NTgzMjV9.QVFFL2FJR1dRamV5Zm9Ba1I0RGNGT0RtUVBYdlBBUUxMNjkxY2hkYVc2d1pIT0krSFI5ekRZS29Ma3VXT3o2SzNxTFdycVFodkRoMDgvSXhPclB3WHc9PQ==";
// if login by token is
// client
// .loginByToken(myToken)
// .then((tokenData) => {
// if (tokenData.userInfo) {
// console.log("Login OK tokenData", tokenData);
// } else {
// console.log("Token invalid");
// }
// })
const loginForm = {
username: "0123456789", // 'phone or email
user_type: "phone", // 'phone' | 'email' | 'ldap'
password: "12345",
expired: 1,
};
// if login by user is
client
.loginByUser(
loginForm.username,
loginForm.user_type,
loginForm.password,
loginForm.expired
)
.then((tokenData) => {
if (tokenData.userInfo) {
console.log("Login OK tokenData", tokenData);
} else {
console.log("Login Fail by user");
}
})
</script>
<body>
This is your page for login form
</body>
</html>
proxy token vefify:
// define your config in
const socketConfig = require("../../cfg/resource-server-socket-cfg");
// include the module
const { VerifyToken } = require("client-socket-nodejs");
// init proxy server connection:
let verifyToken = new VerifyToken(socketConfig);
// verify client token by command:
// token have info of: {username, device_id, iat, exp}
// verifyToken.verify(clientToken,clientDevicename)