trigger-user-save.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. // https://docs.authing.co/v2/reference/sdk-for-node/management/UsersManagementClient.html
  2. const { ManagementClient } = require('authing-node-sdk')
  3. const managementClient = new ManagementClient({
  4. accessKeyId: '6686bffb373d06911e24a969',
  5. accessKeySecret: "4e978331675938d1bc81fb109e67d59a",
  6. host: 'https://textbook.u2-dev.hep.com.cn', // 应用的认证地址
  7. })
  8. /**
  9. * 用户创建前,创建用户至Authing
  10. * @desc 仅同步注册信息及密码,资料在afterSave中同步
  11. */
  12. export function defineUserBeforeSave(){
  13. Parse.Cloud.beforeSave("_User", async (request) => {
  14. let user = request.object;
  15. // 仅首次注册/创建用户/修改密码有password属性,同步Authing账号
  16. let password = user?.get("password");
  17. if(password){
  18. let mobile = user?.get("mobile");
  19. let email = user?.get("email");
  20. let username = user?.get("username");
  21. let externalId = user?.id;
  22. let authingUserExists = await findUserByMobileEmailUserName(user)
  23. if(authingUserExists?.statusCode==404){ // 创建用户
  24. let newuser = {
  25. status:"Activated",
  26. }
  27. if(mobile){newuser.phone = mobile}
  28. if(email){newuser.email = email}
  29. if(username){newuser.username = username}
  30. if(externalId){newuser.externalId = externalId}
  31. result = await managementClient.createUser(newuser)
  32. }
  33. if(authingUserExists?.statusCode==200){
  34. let existsUser = authingUserExists?.data;
  35. try{
  36. let updateRes = await managementClient.updateUser({
  37. userId:existsUser?.userId,
  38. password:password,
  39. })
  40. // console.log(result)
  41. }catch(err){console.log(err)}
  42. }
  43. }
  44. });
  45. }
  46. /**
  47. * 用户删除前,删除用户从Authing
  48. */
  49. export function defineUserBeforeDelete(){
  50. Parse.Cloud.beforeDelete("_User", async (request) => {
  51. let user = request.object;
  52. // console.log(user.toJSON());
  53. // console.log(user?.get("password"))
  54. try{
  55. let authingUserExists = await findUserByMobileEmailUserName(user)
  56. if(authingUserExists?.statusCode==200){
  57. let existsUser = authingUserExists?.data;
  58. let deleteRes = await managementClient.deleteUsersBatch({
  59. // 替换用户 ID 数组
  60. userIds: [existsUser.userId],
  61. options: {
  62. userIdType: "user_id"
  63. }
  64. });
  65. }
  66. }catch(deleteErr){}
  67. });
  68. }
  69. /**
  70. * 用户保存后同步数据至Authing
  71. */
  72. export function defineUserAfterSave(){
  73. Parse.Cloud.afterSave("_User", async (request) => {
  74. // console.log("save _User",request?.object?.id)
  75. let query = new Parse.Query("Profile");
  76. query.equalTo("user",request?.object?.id)
  77. let profile = await query.first();
  78. syncUserProfileToAuthing(request?.object,profile)
  79. });
  80. Parse.Cloud.afterSave("Profile", async (request) => {
  81. // console.log("save Profile",request?.object?.id)
  82. let query = new Parse.Query("Profile");
  83. query.include("user");
  84. profile = await query.get(request?.object?.id);
  85. syncUserProfileToAuthing(profile.get("user"),profile)
  86. });
  87. }
  88. /**
  89. * 查询用户
  90. * @param {*} user
  91. * @returns
  92. * 不存在:
  93. * {
  94. statusCode: 404,
  95. apiCode: 2004,
  96. message: '用户不存在',
  97. requestId: 'e59cb407-f2d9-4bd8-ac93-d2dbc8d6ab72'
  98. }
  99. {
  100. statusCode: 200,
  101. message: '',
  102. data: {
  103. userId: '669676e5a3a9ac870bfff2a3',
  104. createdAt: '2024-07-16T13:34:29.789Z',
  105. updatedAt: '2024-07-16T13:34:29.789Z',
  106. status: 'Activated'
  107. }
  108. }
  109. */
  110. async function findUserByMobileEmailUserName(user){
  111. let mobile = user?.get("mobile");
  112. let email = user?.get("email");
  113. let username = user?.get("username");
  114. let externalId = user?.id;
  115. let result;
  116. if(email){
  117. try{
  118. result = await managementClient.getUser({userIdType:`email`,userId:email})
  119. // console.log(email,result)
  120. }catch(err){}
  121. }
  122. if(mobile&&(!result || result?.statusCode==404)){
  123. try{
  124. result = await managementClient.getUser({userIdType:`phone`,userId:mobile})
  125. // console.log(mobile,result)
  126. }catch(err){}
  127. }
  128. if(username&&(!result || result?.statusCode==404)){
  129. try{
  130. result = await managementClient.getUser({userIdType:`username`,userId:username})
  131. // console.log("username",username,result)
  132. }catch(err){}
  133. }
  134. if(externalId&&(!result || result?.statusCode==404)){
  135. try{
  136. result = await managementClient.getUser({userIdType:`external_id`,userId:externalId})
  137. // console.log(externalId,result)
  138. }catch(err){}
  139. }
  140. return result
  141. }
  142. async function syncUserProfileToAuthing(user,profile){
  143. if(!user?.id) return
  144. let userInfo = user.toJSON();
  145. userInfo = fixJsonFileds(userInfo)
  146. if(profile?.id){
  147. let pjson = profile.toJSON();
  148. delete pjson.objectId;
  149. pjson= fixJsonFileds(pjson)
  150. Object.keys(pjson).forEach(key=>{
  151. userInfo[key] = pjson[key]
  152. })
  153. }
  154. // 映射对应字段
  155. userInfo.company = userInfo.companyName
  156. delete userInfo.companyName
  157. userInfo.userType = userInfo.identity
  158. delete userInfo.identity
  159. userInfo.userId = userInfo.objectId
  160. let authingUserExists = await findUserByMobileEmailUserName(user)
  161. if(authingUserExists?.statusCode==200){
  162. let existsUser = authingUserExists?.data;
  163. userInfo.userId = existsUser.userId
  164. }
  165. delete userInfo.objectId
  166. userInfo.identifyStatus = userInfo.accountState
  167. // 自定义数据全量同步
  168. userInfo.customData = JSON.parse(JSON.stringify(userInfo))
  169. // {
  170. // identifyStatus : userInfo.accountState
  171. // }
  172. // console.log(userInfo)
  173. // 同步数据至Authing用户池
  174. let result
  175. try{
  176. result = await managementClient.updateUser(userInfo)
  177. // console.log(result)
  178. }catch(err){console.log(err)}
  179. }
  180. function fixJsonFileds(json){
  181. // Parse独有关系数据
  182. delete json.ACL
  183. delete json.className
  184. delete json.sessionToken
  185. delete json.company
  186. delete json.user
  187. delete json.createdAt
  188. delete json.updatedAt
  189. // 来自Authing的数据
  190. delete json?.loginsCount
  191. delete json?.lastIP
  192. delete json?.lastLogin
  193. return json
  194. }