|
@@ -1,11 +1,16 @@
|
|
|
const API = require("../../../lib/API")
|
|
const API = require("../../../lib/API")
|
|
|
-const axios = require('axios')
|
|
|
|
|
-const https = require('https')
|
|
|
|
|
const { v4: uuidv4 } = require('uuid')
|
|
const { v4: uuidv4 } = require('uuid')
|
|
|
const db = require("../../../plugin/DataBase/db")
|
|
const db = require("../../../plugin/DataBase/db")
|
|
|
const Redis = require('../../../plugin/DataBase/Redis')
|
|
const Redis = require('../../../plugin/DataBase/Redis')
|
|
|
-const config = require('../../../config.json')
|
|
|
|
|
const { BaseStdResponse } = require("../../../BaseStdResponse")
|
|
const { BaseStdResponse } = require("../../../BaseStdResponse")
|
|
|
|
|
+const { fetchUniLoginProfile, normalizeSocialType } = require('../../../lib/UniLoginClient')
|
|
|
|
|
+const {
|
|
|
|
|
+ getBindingByIdentity,
|
|
|
|
|
+ getLegacyUserByIdentity,
|
|
|
|
|
+ insertSocialBinding,
|
|
|
|
|
+ updateSocialBindingProfile,
|
|
|
|
|
+ syncLegacySocialMirror
|
|
|
|
|
+} = require('../../../lib/UserSocialBinding')
|
|
|
|
|
|
|
|
class Login extends API {
|
|
class Login extends API {
|
|
|
constructor() {
|
|
constructor() {
|
|
@@ -17,49 +22,45 @@ class Login extends API {
|
|
|
|
|
|
|
|
async onRequest(req, res) {
|
|
async onRequest(req, res) {
|
|
|
let { type, code } = req.body
|
|
let { type, code } = req.body
|
|
|
|
|
+ type = normalizeSocialType(type)
|
|
|
|
|
|
|
|
if ([code].some(value => value === '' || value === null || value === undefined))
|
|
if ([code].some(value => value === '' || value === null || value === undefined))
|
|
|
return res.json({
|
|
return res.json({
|
|
|
...BaseStdResponse.MISSING_PARAMETER
|
|
...BaseStdResponse.MISSING_PARAMETER
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- const uniConfig = config.unilogin
|
|
|
|
|
-
|
|
|
|
|
- let url = `${uniConfig.url}/connect.php?act=callback&appid=${uniConfig.appid}&appkey=${uniConfig.appkey}&type=${type || 'qq'}&code=${code}`
|
|
|
|
|
- try {
|
|
|
|
|
- const agent = new https.Agent({
|
|
|
|
|
- rejectUnauthorized: false
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- const r = await axios.get(url, {
|
|
|
|
|
- httpsAgent: agent,
|
|
|
|
|
- proxy: false
|
|
|
|
|
|
|
+ if (!type)
|
|
|
|
|
+ return res.json({
|
|
|
|
|
+ ...BaseStdResponse.ERR,
|
|
|
|
|
+ msg: '不支持的第三方登录类型'
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- if (!r || r.data?.code !== 0) {
|
|
|
|
|
- this.logger.error(`获取用户信息失败!${r.data?.msg || 'api接口错误'}`)
|
|
|
|
|
- return res.json({
|
|
|
|
|
- ...BaseStdResponse.ERR,
|
|
|
|
|
- msg: '获取用户信息失败!'
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- let { social_uid, nickname, faceimg, ip } = r.data
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ let { social_uid, nickname, faceimg, ip } = await fetchUniLoginProfile(type, code)
|
|
|
const session = uuidv4()
|
|
const session = uuidv4()
|
|
|
const time = new Date().getTime()
|
|
const time = new Date().getTime()
|
|
|
|
|
|
|
|
- let selectSql = 'SELECT uuid, username, permission FROM users WHERE social_uid = ? AND social_type = ?'
|
|
|
|
|
- let selectRows = await db.query(selectSql, [social_uid, type || 'qq'])
|
|
|
|
|
-
|
|
|
|
|
- let uuid, username, permission
|
|
|
|
|
|
|
+ let binding = await getBindingByIdentity(type, social_uid)
|
|
|
|
|
+ let uuid = binding?.user_uuid
|
|
|
|
|
+ let selectRows = []
|
|
|
|
|
+
|
|
|
|
|
+ if (uuid) {
|
|
|
|
|
+ selectRows = await db.query('SELECT * FROM users WHERE uuid = ? LIMIT 1', [uuid])
|
|
|
|
|
+ } else {
|
|
|
|
|
+ const legacyUser = await getLegacyUserByIdentity(type, social_uid)
|
|
|
|
|
+ if (legacyUser?.uuid) {
|
|
|
|
|
+ uuid = legacyUser.uuid
|
|
|
|
|
+ await insertSocialBinding(uuid, type, social_uid, nickname, faceimg)
|
|
|
|
|
+ selectRows = await db.query('SELECT * FROM users WHERE uuid = ? LIMIT 1', [uuid])
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- // 用户不存在 执行注册操作
|
|
|
|
|
- if (selectRows.length == 0) {
|
|
|
|
|
|
|
+ if (!uuid) {
|
|
|
uuid = uuidv4()
|
|
uuid = uuidv4()
|
|
|
- username = `用户${uuid.slice(0, 8)}`
|
|
|
|
|
|
|
+ const username = `用户${uuid.slice(0, 8)}`
|
|
|
|
|
|
|
|
let regSql = 'INSERT INTO users (uuid, username, registTime, social_uid, social_type, nickname, avatar, email) VALUES (?,?,?,?,?,?,?,?) '
|
|
let regSql = 'INSERT INTO users (uuid, username, registTime, social_uid, social_type, nickname, avatar, email) VALUES (?,?,?,?,?,?,?,?) '
|
|
|
- let regRows = await db.query(regSql, [uuid, username, time, social_uid, type || 'qq', nickname, faceimg, '未设置'])
|
|
|
|
|
|
|
+ let regRows = await db.query(regSql, [uuid, username, time, social_uid, type, nickname, faceimg, '未设置'])
|
|
|
if (!regRows || regRows.affectedRows !== 1) {
|
|
if (!regRows || regRows.affectedRows !== 1) {
|
|
|
this.logger.error(`聚合登录用户注册失败!数据库错误`)
|
|
this.logger.error(`聚合登录用户注册失败!数据库错误`)
|
|
|
return res.json({
|
|
return res.json({
|
|
@@ -67,40 +68,53 @@ class Login extends API {
|
|
|
msg: '用户注册失败!'
|
|
msg: '用户注册失败!'
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ await insertSocialBinding(uuid, type, social_uid, nickname, faceimg)
|
|
|
|
|
+ selectRows = await db.query('SELECT * FROM users WHERE uuid = ? LIMIT 1', [uuid])
|
|
|
}
|
|
}
|
|
|
- else {
|
|
|
|
|
- uuid = selectRows[0].uuid
|
|
|
|
|
- username = selectRows[0].username
|
|
|
|
|
- permission = selectRows[0].permission
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if (!selectRows || selectRows.length === 0)
|
|
|
|
|
+ return res.json({
|
|
|
|
|
+ ...BaseStdResponse.ERR,
|
|
|
|
|
+ msg: '用户登录失败!请稍后再试'
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ const user = selectRows[0]
|
|
|
|
|
|
|
|
await Redis.set(`userSession:${uuid}`, session, {
|
|
await Redis.set(`userSession:${uuid}`, session, {
|
|
|
EX: 2592000
|
|
EX: 2592000
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+ await db.query(
|
|
|
|
|
+ 'UPDATE users SET lastTime = ?, avatar = ?, nickname = ? WHERE uuid = ?',
|
|
|
|
|
+ [time, faceimg, nickname, uuid]
|
|
|
|
|
+ )
|
|
|
|
|
+ await updateSocialBindingProfile(type, social_uid, nickname, faceimg)
|
|
|
|
|
+ await syncLegacySocialMirror(uuid, type)
|
|
|
|
|
+
|
|
|
res.json({
|
|
res.json({
|
|
|
...BaseStdResponse.OK,
|
|
...BaseStdResponse.OK,
|
|
|
data: {
|
|
data: {
|
|
|
uuid,
|
|
uuid,
|
|
|
- username,
|
|
|
|
|
|
|
+ username: user.username,
|
|
|
session,
|
|
session,
|
|
|
nickname,
|
|
nickname,
|
|
|
- type: type || 'qq',
|
|
|
|
|
- roles: permission || [],
|
|
|
|
|
- avatar: faceimg,
|
|
|
|
|
|
|
+ type,
|
|
|
|
|
+ roles: user.permission || [],
|
|
|
|
|
+ vip: user.vip,
|
|
|
|
|
+ ic_count: user.ic_count,
|
|
|
|
|
+ lepao_count: user.lepao_count,
|
|
|
|
|
+ crouse_count: user.crouse_count,
|
|
|
|
|
+ avatar: faceimg || user.avatar,
|
|
|
|
|
+ email: user.email
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 增加登录记录
|
|
// 增加登录记录
|
|
|
try {
|
|
try {
|
|
|
- if (selectRows.length !== 0) {
|
|
|
|
|
- let updateSql = 'UPDATE users SET lastTime = ?, avatar = ?, nickname = ? WHERE social_uid = ? AND social_type = ?'
|
|
|
|
|
- await db.query(updateSql, [time, faceimg, nickname, social_uid, type || 'qq'])
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
const userAgent = req.headers['user-agent']
|
|
const userAgent = req.headers['user-agent']
|
|
|
let insertSql = 'INSERT INTO login_history (uuid, time, deviceInfo, type, ip) VALUES (?, ?, ?, ?, ?)'
|
|
let insertSql = 'INSERT INTO login_history (uuid, time, deviceInfo, type, ip) VALUES (?, ?, ?, ?, ?)'
|
|
|
- await db.query(insertSql, [uuid, time, { 'ua': userAgent }, type || 'qq', ip])
|
|
|
|
|
|
|
+ await db.query(insertSql, [uuid, time, { 'ua': userAgent }, type, ip])
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
this.logger.error(`写入登录记录失败!${error}`)
|
|
this.logger.error(`写入登录记录失败!${error}`)
|
|
|
}
|
|
}
|