1.0.1 • Published 3 years ago

@tntd/sso-login v1.0.1

Weekly downloads
-
License
-
Repository
github
Last release
3 years ago

sso-longin koa 统一登录中间件


安装

npm i -g @tntd/sso-login 

使用

const Koa = require('koa');
const ssoLogin = require('@tntd/sso-login ');
const app = new Koa();

app.use(ssoLogin(options)); // options 为 JSON object

options

key是否必填描述
rsaKeyE-hr node 解密key
logoutUrl退出接口,默认 '/api/logout'
loginUrl登录页面地址,参考下面统一登录
ehrapi参考 ehrapi 描述

ehrapi 描述

ehrapi = { 
	host: "",  
	url: '/ehrapi/empinfo',  // 建议不填,除非接口地址变更了
	token: ""
}

上下文挂载用户信息

ctx.session.user = {
    sso: true,
    ehrId: '',
    badge: '',
    nickname: '',
    empStatus: '',
    email: '',
    account: '',
    depId: '',
    leaderId: '',
    roleId: ''
};

字段描述 具体类型,参考返回值

字段类型是否为空说明
ssoBoolean上下文二次挂载用户新标识,默认 true
ehrIdint员工ID
badgeString员工工号
nicknameString员工姓名
empStatusint在职状态:1-在职;2-离职
emailStringemail
accountStringAD账号
depIdString所在部门id
leaderIdint直接汇报对象人员ID
roleIdint在职状态:1-在职;2-离职

二次上下文挂载当前系统用户信息

format-session.js 中间件

const UserDao = require('daos/user');
const userDao = new UserDao();

module.exports = (options = {}) => {
	return async (ctx, next) => {
		if (ctx.session && ctx.session.user && ctx.session.user.sso) { // sso 标识
			let userOne = await userDao.findOne({
				where: {
					account: ctx.session.user.account
				}
			});// 根据域账号 获取用户信息
			if (!userOne) {// 当前系统没用找到用户,立即新增用户
				userOne = await userDao.create({ ...ctx.session.user });
			}
			ctx.session.user = {
				...userOne.dataValues,
				password: undefined
			};
		}
		await next();
	};
};
const Koa = require('koa');
const ssoLogin = require('@tntd/sso-login ');
const app = new Koa();

app.use(ssoLogin(options)); // options 为 JSON object
app.use(formatSession());// 上面的中间件 format-session.js

前端

401 跳转登录

const goToLogin = (url, params = {}) => {
    params.callbackUrl = params.callbackUrl || location.href;
    window.location.href = `${url || config.ssoLoginUrl}?tokenEncoding=true&callbackUrl=${params.callbackUrl}`;
};

退出登录

import { stringify } from 'query-string';

const logout = (params = {}) => {
	params.backUrl = params.backUrl || location.href;
	window.location.href = `/api/logout?${stringify(params)}`;
};

前后端工程分开项目

import { searchToObject } from '@/utils'; // URL format对象
import { stringify } from 'query-string';

// 统一登录 token 判断 本地开发使用,线上不会进 if
const { token, ...rest } = searchToObject(location.search);
const backUrl = `${location.protocol}//${location.host}${location.pathname}?${stringify(rest)}`;
if (token) {
    location.href = `/api/login?token=${encodeURIComponent(token)}&backUrl=${encodeURIComponent(backUrl)}`;
}
1.0.1

3 years ago

1.0.0

3 years ago