func-authing-session-sync.js 2.6 KB

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