bjx-auth 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bjx-auth-api.es.js +2 -0
- package/dist/bjx-auth-api.umd.js +2 -0
- package/package.json +35 -0
- package/readme.md +69 -0
- package/src/config.js +59 -0
- package/src/logger.js +15 -0
- package/src/request/axios.js +67 -0
- package/src/request/index.js +12 -0
- package/src/request/passportapi.js +216 -0
- package/src/request/sign/encrypt/index.js +7 -0
- package/src/request/sign/encrypt/node.js +31 -0
- package/src/request/sign/encrypt/web.js +31 -0
- package/src/request/sign/hash/index.js +7 -0
- package/src/request/sign/hash/node.js +14 -0
- package/src/request/sign/hash/web.js +18 -0
- package/src/request/sign/index.js +59 -0
- package/src/request/sign/publicPem.js +45 -0
- package/src/request/sign/reqEncrypt.js +16 -0
- package/src/request/sign/reqSginOld.js +89 -0
- package/src/request/sign/reqSign.js +80 -0
- package/src/request/userInfo.js +72 -0
- package/src/strategy/handle.js +56 -0
- package/src/strategy/handleDemo.js +49 -0
- package/src/strategy/index.js +9 -0
- package/src/strategy/strategy.js +186 -0
- package/src/strategy/utils.js +265 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const {
|
|
2
|
+
setConfig,
|
|
3
|
+
getToken: getTokenApi,
|
|
4
|
+
getUserInfo: getUserInfoApi,
|
|
5
|
+
} = require('../request')
|
|
6
|
+
|
|
7
|
+
async function getToken(cookies, isRefresh, { headers, ctx }) {
|
|
8
|
+
return getTokenApi(
|
|
9
|
+
{
|
|
10
|
+
__isRefresh__: isRefresh,
|
|
11
|
+
headers: {
|
|
12
|
+
Cookie: Object.entries(cookies)
|
|
13
|
+
.map((v) => v.join('='))
|
|
14
|
+
.join('; '),
|
|
15
|
+
...headers,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
ctx,
|
|
20
|
+
},
|
|
21
|
+
).then(({ data }) => {
|
|
22
|
+
if (data.isError === false) {
|
|
23
|
+
return {
|
|
24
|
+
bjx_token_flag: cookies['idsrv.session'],
|
|
25
|
+
token_type: '',
|
|
26
|
+
access_token: data.data.authToken,
|
|
27
|
+
expires_at: data.data.expiresAt || (Date.now() / 1000 + 4 * 3600) | 0, // 4小时过期
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function getUserInfo(token, type, { headers, ctx }) {
|
|
34
|
+
return getUserInfoApi(
|
|
35
|
+
{
|
|
36
|
+
__type__: type,
|
|
37
|
+
headers: {
|
|
38
|
+
AuthToken: token,
|
|
39
|
+
...headers,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
ctx,
|
|
44
|
+
},
|
|
45
|
+
).then(({ data }) => {
|
|
46
|
+
if (data.IsError === false) {
|
|
47
|
+
return data.Data
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
module.exports = {
|
|
53
|
+
setConfig,
|
|
54
|
+
getToken,
|
|
55
|
+
getUserInfo,
|
|
56
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
async function setConfig(obj) {
|
|
2
|
+
console.log('设置配置方法', obj)
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
async function getToken(cookie, { headers }) {
|
|
6
|
+
console.log('令牌方法', cookie, headers)
|
|
7
|
+
return {
|
|
8
|
+
is_bjx_token: true,
|
|
9
|
+
token_type: '',
|
|
10
|
+
access_token:
|
|
11
|
+
'xn4d9DmczNYqDDHt1kHA95l923HSjqNbaYUNVzDNw9FTkxZGg7tsZutqFgfg0gTXoxH9LCxs5uuQ_sBBi54WWg01gESgzSMQV7a1f2utaBr90QPSCy-oLu5YUdHzCPDszfx2P8M4xm4LRMNehjXl8cG0Xph80FdJ7-OntP_ZdGE8ERWAppZATpSZML1oOMj2AKg_Z8YReHTqdp6BuFJqpk2qdCtsFyrqsCbh87pRcghj93eDB4sbSXmKOoc-96LO',
|
|
12
|
+
expires_at: 1756375244,
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async function getUserInfo(token, type, { headers }) {
|
|
17
|
+
console.log('用户信息方法', token, type, headers)
|
|
18
|
+
return {
|
|
19
|
+
ts: new Date().toLocaleString('sv-SE'),
|
|
20
|
+
Id: '4316B40F-DBB6-4AA5-8242-5425C7D36DFB',
|
|
21
|
+
UId: 1100000010,
|
|
22
|
+
UserName: 'bjxadmin',
|
|
23
|
+
NickName: '徐薇',
|
|
24
|
+
Email: 'caoce5158@qq.com',
|
|
25
|
+
EmailIsCheck: true,
|
|
26
|
+
RegionCode: '+86',
|
|
27
|
+
Phone: '13911112222',
|
|
28
|
+
PhoneIsCheck: true,
|
|
29
|
+
HeadUrl:
|
|
30
|
+
'https://static.bjx.com.cn/EnterpriseNew/SeekerImg/1100000010/2023050813520237_74810.jpeg',
|
|
31
|
+
BackImage:
|
|
32
|
+
'http://img01.mybjx.net/webupload/image/20231109/3e06d701bc00002.png',
|
|
33
|
+
BriefIntro: '',
|
|
34
|
+
Industry: 1300,
|
|
35
|
+
Source: 9,
|
|
36
|
+
ShowName: '徐薇',
|
|
37
|
+
HeadIsDef: false,
|
|
38
|
+
Nick: '',
|
|
39
|
+
NickShowName: '星友2222',
|
|
40
|
+
RegDate: '2016-05-09T17:14:56.473',
|
|
41
|
+
PwdIsSet: false,
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
module.exports = {
|
|
46
|
+
setConfig,
|
|
47
|
+
getToken,
|
|
48
|
+
getUserInfo,
|
|
49
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
const { Strategy } = require('passport')
|
|
2
|
+
const { setConfig, getToken, getUserInfo } = require('./handle')
|
|
3
|
+
const { errorLogger, debugLogger } = require('../logger')
|
|
4
|
+
|
|
5
|
+
class BjxStrategy extends Strategy {
|
|
6
|
+
constructor(options = {}, verify) {
|
|
7
|
+
super()
|
|
8
|
+
|
|
9
|
+
// 策略名称
|
|
10
|
+
this.name = 'bjx'
|
|
11
|
+
|
|
12
|
+
// 配置选项
|
|
13
|
+
this.loadUserInfo = options.loadUserInfo || false
|
|
14
|
+
this.userInfoDuration = this.normalizeDuration(options.loadUserInfo)
|
|
15
|
+
this.userInfoType = options.userInfoType || ''
|
|
16
|
+
this.authConfig = options.authConfig || {}
|
|
17
|
+
this.verify = verify || ((user, done) => done(null, user))
|
|
18
|
+
|
|
19
|
+
// 设置配置缓存
|
|
20
|
+
setConfig(this.authConfig)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
normalizeDuration(val) {
|
|
24
|
+
// loadUserInfo参数 单位为分钟 但是这里返回毫秒 减少比较时的计算
|
|
25
|
+
if (typeof val === 'number' && val > 0) {
|
|
26
|
+
return val * 60 * 1000
|
|
27
|
+
}
|
|
28
|
+
return 30 * 60 * 1000
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
authenticate(req, options) {
|
|
32
|
+
// 检查必要的cookie
|
|
33
|
+
const hasRequiredCookies =
|
|
34
|
+
req.cookies &&
|
|
35
|
+
req.cookies.get('idsrv.session') &&
|
|
36
|
+
req.cookies.get('.AspNetCore.Identity.Application')
|
|
37
|
+
|
|
38
|
+
// 假如不存在 则认证失败
|
|
39
|
+
if (!hasRequiredCookies) {
|
|
40
|
+
return this.fail(new Error('Missing required cookies'))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 否则 执行认证流程
|
|
44
|
+
this.executeAuthentication(req)
|
|
45
|
+
.then((user) =>
|
|
46
|
+
// 创建策略时 可传入回调函数 已追加认证逻辑
|
|
47
|
+
this.verify(user, (err, verifiedUser) => {
|
|
48
|
+
if (err) return this.error(err)
|
|
49
|
+
this.success(verifiedUser)
|
|
50
|
+
}),
|
|
51
|
+
)
|
|
52
|
+
.catch((err) => {
|
|
53
|
+
if (err.message === '__goto_next__') {
|
|
54
|
+
this.pass()
|
|
55
|
+
} else {
|
|
56
|
+
this.error(err)
|
|
57
|
+
}
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async executeAuthentication(req) {
|
|
62
|
+
// 获取请求头信息
|
|
63
|
+
const headers = this.extractHeaders(req)
|
|
64
|
+
|
|
65
|
+
// 获取cookie
|
|
66
|
+
const cookies = {
|
|
67
|
+
'idsrv.session': req.cookies.get('idsrv.session'),
|
|
68
|
+
'.AspNetCore.Identity.Application': req.cookies.get(
|
|
69
|
+
'.AspNetCore.Identity.Application',
|
|
70
|
+
),
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// 获取令牌 不存在时直接抛出错误
|
|
74
|
+
const tokenData = await this.getTokenWithRefresh(cookies, req, headers)
|
|
75
|
+
if (!tokenData) throw new Error('Get token failed')
|
|
76
|
+
|
|
77
|
+
// 获取用户信息 假如配置中为false 则不获取
|
|
78
|
+
let userInfo
|
|
79
|
+
if (this.loadUserInfo) {
|
|
80
|
+
const token = tokenData.access_token
|
|
81
|
+
userInfo = await this.getUserInfoWithRefresh(token, req, headers)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
token: tokenData,
|
|
86
|
+
info: userInfo,
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
extractHeaders(req) {
|
|
91
|
+
return {
|
|
92
|
+
'X-Forwarded-For': req.headers['x-forwarded-for'],
|
|
93
|
+
'X-Forwarded-Host': req.headers['x-forwarded-host'],
|
|
94
|
+
'User-Agent': req.headers['user-agent'],
|
|
95
|
+
Referer: req.headers['referer'],
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async getTokenWithRefresh(cookies, req, headers) {
|
|
100
|
+
const su = req?.session?.passport?.user || {}
|
|
101
|
+
const now = Date.now()
|
|
102
|
+
|
|
103
|
+
// 判断token的标识和cookie中的标识是否一致
|
|
104
|
+
if (su.token?.bjx_token_flag !== cookies['idsrv.session']) {
|
|
105
|
+
su.token = undefined
|
|
106
|
+
su.info = undefined
|
|
107
|
+
debugLogger('令牌标识和cookie内的不一致')
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// 检查passport中的令牌 是否需要刷新
|
|
111
|
+
if (su.token && su.token.expires_at * 1000 > now) {
|
|
112
|
+
throw new Error('__goto_next__')
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// 假如存在token 还到这一步 说明是刷新token
|
|
116
|
+
const isRefresh = !!su.token
|
|
117
|
+
if (isRefresh) {
|
|
118
|
+
debugLogger('更新令牌')
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// 获取新token
|
|
122
|
+
const newToken = await getToken(cookies, isRefresh, {
|
|
123
|
+
ctx: req.ctx,
|
|
124
|
+
headers,
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
debugLogger('获取“新”令牌', cookies, isRefresh, newToken || '无')
|
|
128
|
+
return newToken
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async getUserInfoWithRefresh(token, req, headers) {
|
|
132
|
+
const su = req?.session?.passport?.user || {}
|
|
133
|
+
const now = Date.now()
|
|
134
|
+
|
|
135
|
+
// 检查passport中的用户信息 是否需要刷新
|
|
136
|
+
if (su.info && su.info.__expires_at__ > now) {
|
|
137
|
+
throw new Error('__goto_next__')
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// 获取新用户信息
|
|
141
|
+
const newUserInfo = await getUserInfo(token, this.userInfoType, {
|
|
142
|
+
ctx: req.ctx,
|
|
143
|
+
headers,
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
// 设置用户信息的过期时间 这里用毫秒
|
|
147
|
+
if (newUserInfo) {
|
|
148
|
+
newUserInfo.__expires_at__ = now + this.userInfoDuration
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
debugLogger('获取“新”用户信息', token, newUserInfo || '无')
|
|
152
|
+
return newUserInfo
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Koa中间件
|
|
157
|
+
function createBjxAuthMiddleware(passport) {
|
|
158
|
+
return async (ctx, next) => {
|
|
159
|
+
await new Promise((resolve) => {
|
|
160
|
+
passport.authenticate('bjx', (err, user, info, status) => {
|
|
161
|
+
if (err) {
|
|
162
|
+
// this.error()
|
|
163
|
+
errorLogger(err)
|
|
164
|
+
ctx.logout()
|
|
165
|
+
} else if (user) {
|
|
166
|
+
// this.success()
|
|
167
|
+
ctx.login(user)
|
|
168
|
+
} else {
|
|
169
|
+
// this.fail()
|
|
170
|
+
ctx.logout()
|
|
171
|
+
}
|
|
172
|
+
resolve()
|
|
173
|
+
})(ctx, () => {
|
|
174
|
+
// this.pass()
|
|
175
|
+
resolve()
|
|
176
|
+
})
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
await next()
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
module.exports = {
|
|
184
|
+
BjxStrategy,
|
|
185
|
+
createBjxAuthMiddleware,
|
|
186
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
const config = require('../config')
|
|
2
|
+
|
|
3
|
+
function objToQs(obj) {
|
|
4
|
+
if (!obj || Object.keys(obj).length === 0) return ''
|
|
5
|
+
const params = []
|
|
6
|
+
for (const key in obj) {
|
|
7
|
+
if (obj[key]) {
|
|
8
|
+
params.push(`${key}=${encodeURIComponent(obj[key])}`)
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return params.join('&')
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function hostToSite(host) {
|
|
15
|
+
const map = {
|
|
16
|
+
hr: 30000,
|
|
17
|
+
|
|
18
|
+
dljob: 30100,
|
|
19
|
+
hdjob: 30101,
|
|
20
|
+
fdjob: 30102,
|
|
21
|
+
sdjob: 30103,
|
|
22
|
+
hedjob: 30104,
|
|
23
|
+
gfjob: 30105,
|
|
24
|
+
zhnyfwjob: 30106,
|
|
25
|
+
shdjob: 30107,
|
|
26
|
+
tanjob: 30108,
|
|
27
|
+
qnjob: 30109,
|
|
28
|
+
|
|
29
|
+
dqjob: 30200,
|
|
30
|
+
cnjob: 30201,
|
|
31
|
+
spdjob: 30202,
|
|
32
|
+
zdhjob: 30203,
|
|
33
|
+
xxhjob: 30204,
|
|
34
|
+
|
|
35
|
+
hbjob: 30300,
|
|
36
|
+
scljob: 30301,
|
|
37
|
+
gfcljob: 30302,
|
|
38
|
+
dqzljob: 30303,
|
|
39
|
+
jchpjob: 30304,
|
|
40
|
+
hbfdjob: 30305,
|
|
41
|
+
hbgcjob: 30306,
|
|
42
|
+
hbsbjob: 30307,
|
|
43
|
+
hjxfjob: 30308,
|
|
44
|
+
jnjob: 30309,
|
|
45
|
+
|
|
46
|
+
gcjob: 30400,
|
|
47
|
+
dlgcjob: 30401,
|
|
48
|
+
jzjob: 30402,
|
|
49
|
+
szlqjob: 30403,
|
|
50
|
+
gdjob: 30404,
|
|
51
|
+
jdjob: 30406,
|
|
52
|
+
sjjob: 30407,
|
|
53
|
+
jljob: 30408,
|
|
54
|
+
gczjjob: 30409,
|
|
55
|
+
|
|
56
|
+
dcjob: 30500,
|
|
57
|
+
dcscjob: 30501,
|
|
58
|
+
dcyyjob: 30502,
|
|
59
|
+
dccljob: 30503,
|
|
60
|
+
dchsjob: 30504,
|
|
61
|
+
dcjsjob: 30507,
|
|
62
|
+
|
|
63
|
+
spdsbjob: 30601,
|
|
64
|
+
pdywjob: 30602,
|
|
65
|
+
pwpdgcjob: 30603,
|
|
66
|
+
znwdwjob: 30604,
|
|
67
|
+
zlpdwjob: 30605,
|
|
68
|
+
xndcjob: 30606,
|
|
69
|
+
|
|
70
|
+
dlscjob: 30700,
|
|
71
|
+
|
|
72
|
+
mhr: 40000,
|
|
73
|
+
|
|
74
|
+
mdljob: 40100,
|
|
75
|
+
mhdjob: 40101,
|
|
76
|
+
mfdjob: 40102,
|
|
77
|
+
msdjob: 40103,
|
|
78
|
+
mhedjob: 40104,
|
|
79
|
+
mgfjob: 40105,
|
|
80
|
+
mzhnyfwjob: 40106,
|
|
81
|
+
mshdjob: 40107,
|
|
82
|
+
mtanjob: 40108,
|
|
83
|
+
mqnjob: 40109,
|
|
84
|
+
|
|
85
|
+
mdqjob: 40200,
|
|
86
|
+
mcnjob: 40201,
|
|
87
|
+
mspdjob: 40202,
|
|
88
|
+
mzdhjob: 40203,
|
|
89
|
+
mxxhjob: 40204,
|
|
90
|
+
|
|
91
|
+
mhbjob: 40300,
|
|
92
|
+
mscljob: 40301,
|
|
93
|
+
mgfcljob: 40302,
|
|
94
|
+
mdqzljob: 40303,
|
|
95
|
+
mjchpjob: 40304,
|
|
96
|
+
mhbfdjob: 40305,
|
|
97
|
+
mhbgcjob: 40306,
|
|
98
|
+
mhbsbjob: 40307,
|
|
99
|
+
mhjxfjob: 40308,
|
|
100
|
+
mjnjob: 40309,
|
|
101
|
+
|
|
102
|
+
mgcjob: 40400,
|
|
103
|
+
mdlgcjob: 40401,
|
|
104
|
+
mjzjob: 40402,
|
|
105
|
+
mszlqjob: 40403,
|
|
106
|
+
mgdjob: 40404,
|
|
107
|
+
mjdjob: 40406,
|
|
108
|
+
msjjob: 40407,
|
|
109
|
+
mjljob: 40408,
|
|
110
|
+
mgczjjob: 40409,
|
|
111
|
+
|
|
112
|
+
mdcjob: 40500,
|
|
113
|
+
mdcscjob: 40501,
|
|
114
|
+
mdcyyjob: 40502,
|
|
115
|
+
mdccljob: 40503,
|
|
116
|
+
mdchsjob: 40504,
|
|
117
|
+
mdcjsjob: 40507,
|
|
118
|
+
|
|
119
|
+
mspdsbjob: 40601,
|
|
120
|
+
mpdywjob: 40602,
|
|
121
|
+
mpwpdgcjob: 40603,
|
|
122
|
+
mznwdwjob: 40604,
|
|
123
|
+
mzlpdwjob: 40605,
|
|
124
|
+
mxndcjob: 40606,
|
|
125
|
+
|
|
126
|
+
mdlscjob: 40700,
|
|
127
|
+
|
|
128
|
+
yun: 3099,
|
|
129
|
+
yun: 30991,
|
|
130
|
+
yun: 30992,
|
|
131
|
+
yun: 30993,
|
|
132
|
+
yun: 30994,
|
|
133
|
+
yun: 30995,
|
|
134
|
+
yun: 30996,
|
|
135
|
+
sxh: 3094,
|
|
136
|
+
msxh: 3093,
|
|
137
|
+
xiaoyuan: 3091,
|
|
138
|
+
mxiaoyuan: 4091,
|
|
139
|
+
xxsxh: 3090,
|
|
140
|
+
mxxsxh: 4090,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
for (const k in map) {
|
|
144
|
+
if (host.includes(k)) return k + '.bjx.com.cn'
|
|
145
|
+
if (host.includes(map[k])) return k + '.bjx.com.cn'
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return 'hr.bjx.com.cn'
|
|
149
|
+
}
|
|
150
|
+
function handleCtx(ctx, needSite) {
|
|
151
|
+
let f = ctx.query.f || ''
|
|
152
|
+
const origin = ctx.origin
|
|
153
|
+
const originReg = new RegExp('^' + origin)
|
|
154
|
+
const rootReg = /^\//
|
|
155
|
+
if (rootReg.test(f)) {
|
|
156
|
+
f = origin + f
|
|
157
|
+
} else if (f && !originReg.test(f)) {
|
|
158
|
+
f = origin
|
|
159
|
+
} else if (!f) {
|
|
160
|
+
const referer = ctx.headers['referer']
|
|
161
|
+
if (originReg.test(referer) && referer !== ctx.href) {
|
|
162
|
+
f = referer
|
|
163
|
+
} else {
|
|
164
|
+
f = origin
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const obj = {
|
|
169
|
+
returnUrl: f,
|
|
170
|
+
}
|
|
171
|
+
if (needSite) {
|
|
172
|
+
const fHost = f.replace(/^https?:\/\//, '').replace(/\/.*/, '')
|
|
173
|
+
obj.site = hostToSite(fHost)
|
|
174
|
+
}
|
|
175
|
+
return obj
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function getLoginCenterUrl(opts, type = '') {
|
|
179
|
+
const {
|
|
180
|
+
ctx,
|
|
181
|
+
site = '',
|
|
182
|
+
returnUrl = '',
|
|
183
|
+
BA = '',
|
|
184
|
+
BP = '',
|
|
185
|
+
OS = '',
|
|
186
|
+
EQP = '',
|
|
187
|
+
...otherQueryParams
|
|
188
|
+
} = opts || {}
|
|
189
|
+
if (!site && !ctx) throw new Error('site is required')
|
|
190
|
+
if (!returnUrl && !ctx) throw new Error('returnUrl is required')
|
|
191
|
+
const { clientId, login: loginCenter } = config
|
|
192
|
+
const pp = objToQs({
|
|
193
|
+
BA: BA || ctx?.query?.ba || config.ba || '',
|
|
194
|
+
BP: BP || ctx?.query?.bp || config.bp || '',
|
|
195
|
+
OS: OS || config.os || 1,
|
|
196
|
+
EQP: EQP || config.eqp || '',
|
|
197
|
+
})
|
|
198
|
+
let sr
|
|
199
|
+
if (ctx && (!site || !returnUrl)) {
|
|
200
|
+
sr = handleCtx(ctx, !site)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const qs = {
|
|
204
|
+
site: site ? site : sr.site,
|
|
205
|
+
clientId,
|
|
206
|
+
pp,
|
|
207
|
+
...otherQueryParams,
|
|
208
|
+
returnUrl: returnUrl ? returnUrl : sr.returnUrl,
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const qsStr = objToQs(qs)
|
|
212
|
+
const login = `/Account/Login?${qsStr}`
|
|
213
|
+
const register = `/Account/Register?${qsStr}`
|
|
214
|
+
const logout = `/Account/Logout?${qsStr}`
|
|
215
|
+
const bind = `/External/UserBind?${qsStr}`
|
|
216
|
+
const logout2 = `/Account/Logout?${
|
|
217
|
+
qsStr.replace('returnUrl=.+$', '') + encodeURIComponent(login)
|
|
218
|
+
}`
|
|
219
|
+
const paths = {
|
|
220
|
+
login,
|
|
221
|
+
register,
|
|
222
|
+
logout,
|
|
223
|
+
bind,
|
|
224
|
+
logout2,
|
|
225
|
+
}
|
|
226
|
+
const urls = {
|
|
227
|
+
login: `${loginCenter}${paths.login}`,
|
|
228
|
+
register: `${loginCenter}${paths.register}`,
|
|
229
|
+
logout: `${loginCenter}${paths.logout}`,
|
|
230
|
+
bind: `${loginCenter}${paths.bind}`,
|
|
231
|
+
logout2: `${loginCenter}${paths.logout2}`,
|
|
232
|
+
returnUrl: sr.returnUrl,
|
|
233
|
+
}
|
|
234
|
+
if (!type) {
|
|
235
|
+
return urls
|
|
236
|
+
} else {
|
|
237
|
+
let typeArr = []
|
|
238
|
+
if (Array.isArray(type)) {
|
|
239
|
+
typeArr = type
|
|
240
|
+
} else if (typeof type === 'string') {
|
|
241
|
+
typeArr = type.split(',').map((v) => v.trim())
|
|
242
|
+
}
|
|
243
|
+
if (!typeArr.length) {
|
|
244
|
+
return urls
|
|
245
|
+
}
|
|
246
|
+
const obj = {}
|
|
247
|
+
typeArr.forEach((item) => {
|
|
248
|
+
const url = urls[item]
|
|
249
|
+
if (url) {
|
|
250
|
+
obj[item] = url
|
|
251
|
+
}
|
|
252
|
+
})
|
|
253
|
+
if (Object.keys(obj).length === 1) {
|
|
254
|
+
return Object.values(obj)[0]
|
|
255
|
+
} else if (Object.keys(obj).length) {
|
|
256
|
+
return obj
|
|
257
|
+
} else {
|
|
258
|
+
return urls
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
module.exports = {
|
|
264
|
+
getLoginCenterUrl,
|
|
265
|
+
}
|