func-authing-session-sync.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. const { AuthenticationClient } = require('authing-js-sdk')
  2. import { pgClient } from '../../db/pg-instance'
  3. // const { pgClient } = require('../../db/pg-instance')
  4. export function defineAuthingLogin(){
  5. Parse.Cloud.define("authingLogin", async (request) => {
  6. let token = request.params.token;
  7. if(token) {
  8. let result = await syncSessionWithIdToken(token);
  9. return result;
  10. }
  11. return null;
  12. },{
  13. fields : {
  14. token:{
  15. required:true
  16. }
  17. }
  18. });
  19. }
  20. /**
  21. * 同步用户登录信息
  22. * @desc
  23. * https://docs.authing.cn/v2/reference/sdk-for-node/authentication/AuthenticationClient.html#获取当前登录的用户信息
  24. * @param {*} token
  25. * @returns
  26. */
  27. async function syncSessionWithIdToken(token){
  28. // 通过用户的 id_token 初始化之后获取用户信息
  29. let authenticationClient = new AuthenticationClient({
  30. appId: '669b25e1731d50c59f5494d1',
  31. appHost: 'https://textbook.u2-dev.hep.com.cn', // 应用的认证地址
  32. token: token
  33. })
  34. let user = await authenticationClient.getCurrentUser()
  35. // console.log(user)
  36. // 生成Parse库所需_Session记录 objectId唯一
  37. let sessionObjectId = generateObjectId(user?.id+user?.token);
  38. let username = user?.username || user?.phone || user?.email
  39. let ParseExistUser = await getParseUserByAuthingUser(user);
  40. // console.log("ParseExistUser",ParseExistUser);
  41. let userId = ParseExistUser?.objectId || user?.id;
  42. let syncSessionSQL = `
  43. INSERT INTO "_User" (
  44. "objectId", "username","mobile","phone", "createdAt", "updatedAt",
  45. "lastIP","lastLogin","userSourceType","loginsCount"
  46. )
  47. VALUES
  48. (
  49. $2,$7,$8,$8,$5,$6,
  50. $9,$10,$11,$12
  51. )
  52. ON conflict("objectId") DO UPDATE
  53. SET
  54. "username" = excluded."username",
  55. "updatedAt"=excluded."updatedAt",
  56. "mobile"=excluded."mobile",
  57. "phone"=excluded."phone",
  58. "lastIP"=excluded."lastIP",
  59. "lastLogin"=excluded."lastLogin",
  60. "userSourceType"=excluded."userSourceType",
  61. "loginsCount"=excluded."loginsCount";
  62. INSERT INTO "_Session" ("objectId", "user", "sessionToken","expiresAt", "createdAt")
  63. VALUES
  64. ($1, $2,$3,$4,$5)
  65. ON conflict("objectId") DO UPDATE
  66. SET
  67. "user" = excluded."user",
  68. "sessionToken" = excluded."sessionToken",
  69. "expiresAt"=excluded."expiresAt";
  70. `
  71. let params = [
  72. // 1-4
  73. sessionObjectId,userId,user?.token,user?.tokenExpiredAt,
  74. // 5-8
  75. new Date(),new Date(),username,user?.phone,
  76. // 9-12
  77. user?.lastIP, user?.lastLogin, user?.userSourceType,user?.loginsCount
  78. ]
  79. if(user?.id&&user?.token){
  80. try {
  81. // 查询:数据库版本信息
  82. let data = await pgClient().any(syncSessionSQL,params);
  83. // console.log(data)
  84. return {
  85. sid:sessionObjectId,
  86. uid:user?.id,
  87. sessionToken:user?.token
  88. };
  89. } catch (error) {
  90. console.error('Error executing query:', error);
  91. return error;
  92. }
  93. }
  94. }
  95. module.exports.syncSessionWithIdToken = syncSessionWithIdToken
  96. async function getParseUserByAuthingUser(user){
  97. let sql = `
  98. SELECT * FROM "_User" WHERE
  99. "objectId"=$1 OR
  100. "objectId"=$2 OR
  101. "username"=$3 OR
  102. "username"=$4 OR
  103. "username"=$5 OR
  104. ("mobile" IS NOT NULL AND "mobile" = $4) OR
  105. ("phone" IS NOT NULL AND "phone" = $4) OR
  106. ("mobile" IS NOT NULL AND "mobile" = $5) OR
  107. ("phone" IS NOT NULL AND "phone" = $5) OR
  108. ("email" IS NOT NULL AND "email" = $6)
  109. `
  110. let params = [
  111. user?.id,
  112. user?.externalId,
  113. user?.username,
  114. user?.phone,
  115. user?.mobile,
  116. user?.email
  117. ]
  118. let data = []
  119. try{
  120. data = await pgClient().any(sql,params);
  121. // console.log("data",data)
  122. if(data?.length){
  123. return data[0]
  124. }
  125. }catch(err){
  126. console.error(err)
  127. }
  128. return null
  129. }
  130. const crypto = require('crypto');
  131. function generateObjectId(inputString) {
  132. const hash = crypto.createHash('sha256').update(inputString).digest('hex');
  133. const objectId = hash;
  134. return objectId;
  135. }