register.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. const {
  2. userCollection,
  3. LOG_TYPE
  4. } = require('../../common/constants')
  5. const {
  6. ERROR
  7. } = require('../../common/error')
  8. const {
  9. findUser
  10. } = require('./account')
  11. const {
  12. getValidInviteCode,
  13. generateInviteInfo
  14. } = require('./fission')
  15. const {
  16. logout
  17. } = require('./logout')
  18. const PasswordUtils = require('./password')
  19. const {
  20. merge
  21. } = require('../npm/index')
  22. async function realPreRegister (params = {}) {
  23. const {
  24. user
  25. } = params
  26. const {
  27. userMatched
  28. } = await findUser({
  29. userQuery: user,
  30. authorizedApp: this.getUniversalClientInfo().appId
  31. })
  32. if (userMatched.length > 0) {
  33. throw {
  34. errCode: ERROR.ACCOUNT_EXISTS
  35. }
  36. }
  37. }
  38. async function preRegister (params = {}) {
  39. try {
  40. await realPreRegister.call(this, params)
  41. } catch (error) {
  42. await this.middleware.uniIdLog({
  43. success: false,
  44. type: LOG_TYPE.REGISTER
  45. })
  46. throw error
  47. }
  48. }
  49. async function preRegisterWithPassword (params = {}) {
  50. const {
  51. user,
  52. password
  53. } = params
  54. await preRegister.call(this, {
  55. user
  56. })
  57. const passwordUtils = new PasswordUtils({
  58. clientInfo: this.getUniversalClientInfo(),
  59. passwordSecret: this.config.passwordSecret
  60. })
  61. const {
  62. passwordHash,
  63. version
  64. } = passwordUtils.generatePasswordHash({
  65. password
  66. })
  67. const extraData = {
  68. password: passwordHash,
  69. password_secret_version: version
  70. }
  71. return {
  72. user,
  73. extraData
  74. }
  75. }
  76. async function thirdPartyRegister ({
  77. user = {}
  78. } = {}) {
  79. return {
  80. mobileConfirmed: !!(user.mobile && user.mobile_confirmed) || false,
  81. emailConfirmed: !!(user.email && user.email_confirmed) || false
  82. }
  83. }
  84. async function postRegister (params = {}) {
  85. const {
  86. user,
  87. extraData = {},
  88. isThirdParty = false,
  89. inviteCode
  90. } = params
  91. const {
  92. appId,
  93. appName,
  94. appVersion,
  95. appVersionCode,
  96. channel,
  97. scene,
  98. clientIP,
  99. osName
  100. } = this.getUniversalClientInfo()
  101. const uniIdToken = this.getUniversalUniIdToken()
  102. merge(user, extraData)
  103. const registerChannel = channel || scene
  104. user.register_env = {
  105. appid: appId || '',
  106. uni_platform: this.clientPlatform || '',
  107. os_name: osName || '',
  108. app_name: appName || '',
  109. app_version: appVersion || '',
  110. app_version_code: appVersionCode || '',
  111. channel: registerChannel ? registerChannel + '' : '', // channel可能为数字,统一存为字符串
  112. client_ip: clientIP || ''
  113. }
  114. user.register_date = Date.now()
  115. user.dcloud_appid = [appId]
  116. if (user.username) {
  117. user.username = user.username.toLowerCase()
  118. }
  119. if (user.email) {
  120. user.email = user.email.toLowerCase()
  121. }
  122. const {
  123. autoSetInviteCode, // 注册时自动设置邀请码
  124. forceInviteCode, // 必须有邀请码才允许注册,注意此逻辑不可对admin生效
  125. userRegisterDefaultRole // 用户注册时配置的默认角色
  126. } = this.config
  127. if (autoSetInviteCode) {
  128. user.my_invite_code = await getValidInviteCode()
  129. }
  130. // 如果用户注册默认角色配置存在且不为空数组
  131. if (userRegisterDefaultRole && userRegisterDefaultRole.length) {
  132. // 将用户已有的角色和配置的默认角色合并成一个数组,并去重
  133. user.role = Array.from(new Set([...(user.role || []), ...userRegisterDefaultRole]))
  134. }
  135. const isAdmin = user.role && user.role.includes('admin')
  136. if (forceInviteCode && !isAdmin && !inviteCode) {
  137. throw {
  138. errCode: ERROR.INVALID_INVITE_CODE
  139. }
  140. }
  141. if (inviteCode) {
  142. const {
  143. inviterUid,
  144. inviteTime
  145. } = await generateInviteInfo({
  146. inviteCode
  147. })
  148. user.inviter_uid = inviterUid
  149. user.invite_time = inviteTime
  150. }
  151. if (uniIdToken) {
  152. try {
  153. await logout.call(this)
  154. } catch (error) { }
  155. }
  156. const beforeRegister = this.hooks.beforeRegister
  157. let userRecord = user
  158. if (beforeRegister) {
  159. userRecord = await beforeRegister({
  160. userRecord,
  161. clientInfo: this.getUniversalClientInfo()
  162. })
  163. }
  164. const {
  165. id: uid
  166. } = await userCollection.add(userRecord)
  167. const createTokenRes = await this.uniIdCommon.createToken({
  168. uid
  169. })
  170. const {
  171. errCode,
  172. token,
  173. tokenExpired
  174. } = createTokenRes
  175. if (errCode) {
  176. throw createTokenRes
  177. }
  178. await this.middleware.uniIdLog({
  179. data: {
  180. user_id: uid
  181. },
  182. type: LOG_TYPE.REGISTER
  183. })
  184. return {
  185. errCode: 0,
  186. uid,
  187. newToken: {
  188. token,
  189. tokenExpired
  190. },
  191. ...(
  192. isThirdParty
  193. ? thirdPartyRegister({
  194. user: {
  195. ...userRecord,
  196. _id: uid
  197. }
  198. })
  199. : {}
  200. ),
  201. passwordConfirmed: !!userRecord.password
  202. }
  203. }
  204. module.exports = {
  205. preRegister,
  206. preRegisterWithPassword,
  207. postRegister
  208. }