func-authing-session-sync.js 3.1 KB

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