资讯专栏INFORMATION COLUMN

基于koa2开发的用户中心

xiangzhihong / 985人阅读

摘要:加盐加密原始密码加密密码密码对比原始密码加密密码比对结果密码匹配密码不匹配测试用例文件夹工具类的封装

Ucenter

github

API doc

版本

version content date
v0.1.0 项目迁移构建 17.04.23
v0.2.0 支持通过github授权登录 17.05.23

model设计

redis

app.js

key type name
apps hash hget apps {appId} =>{app secret}

token.js

key type name
token:${token} hash key为token的值
-access_token hash field access token
-refresh_token hash field refresh token
-app_id hash field token 对应的app
-user_id hash field token对应的user id (objectId)
-user_short_id hash field token对应的user 短id
-expire_at hash field token 到期日期(timestamp)
-type hash field token类型 (access_token/refresh_token)

user.js

key value name
user:total:${app} keys 存储app对应的用户总数
${year}-${month}-${today}:${app} bitmap 存储每个app每日每个用户的在线状态和在线总数(详情可搜索如何用bitmap存储用户访问信息)

mongo

user.js

key type name
_id ObjectId mongo主键
short_id Number 用户短id 基于redis.userTotalCount
name String 用户名
mobile String 用户注册手机
apps Array 用户关联的apps,以appId组成的Array
status Number 用户状态 0:active 1:baned
create_at Date 用户创建日期
chance Number 创建的时候随机生成的0~1数,用于随机选取用户
oauth Array 存储用户授权平台的信息
-platform String 授权平台名称
-platform_user_id String 平台的用户id
-platform_user_name String 平台用户名
-email String 用户在平台绑定的邮箱
-avatar String 平台的用户头像
-status Number 用户状态 0:active 1:baned
-bind_at Date 绑定时间

索引:

    users.index({create_at: -1});
    users.index({name: 1});
    users.index({mobile: 1});
    users.index({"oauth.platform": 1,"oauth.platform_user_id": 1}, {unique: true});

app.js

key type name
_id ObjectId mongo主键
app_id String app 独立的id,每个app唯一
user_id String 关联用户表的_id
password String 用户密码
status Number 用户状态 0:active 1:baned
create_at Date 用户改app的注册时间
update_at Date 用户信息更新时间
last_login Date 上次登录时间
last_refresh Date 上册refresh token 时间
login_times Number 登陆次数

索引:

    apps.index({app_id: 1, user_id: 1});

token.js

key type name
_id ObjectId mongo主键
user_id String token关联用户表的_id
app_id String token关联的app_id
access_token String access token
refresh_token String refresh token
access_expire_at Date access token 的到期时间
refresh_expire_at Date refresh token 的到期时间
platform Array 使用过的平台

索引:

    tokens.index({app_id: 1, user_id: 1});

工程目录

common

const.js 存放静态变量

error.map.js 存放错误码

config

config.dev.js 存放开发环境配置

config.workong.js 开发环境配置示例

config.production.js 存放生产环境配置

index.js 根据运行环境返回配置文件

controller 业务逻辑存放的文件目录

dao 数据库代理文件夹

mongo 对mongo的数据操作

sql 对sql的数据操作

redis 对redis的数据操作

logs 日志文件夹

midware

filter 该文件夹下的文件基于业务分类,封装了每个接口的数据过滤中间件

auth.js 验证中间件,验证token的合法性等用途

log.js 我使用的是使用log4js,所以基于业务配置了不同的appender
这里放一点代码解释会实际一点

const log4js = require("log4js"),
      adminLogger = log4js.getLogger("admin"),
      oauthLogger = log4js.getLogger("oauth"),
         commonLogger = log4js.getLogger("common"),
        userLogger = log4js.getLogger("user");
var user = async(ctx, next) => {
      ctx.logger = userLogger;
         await next()
};   

model 数据库model定义

router 路由定义

service 第三方服务等封装,例如我把密码加密,验证放在了这里做成一个服务,token也封装成一个服务,这样以后更改密码加密形式或者token加密形式的时候就可以直接在这里改。

passport.js

var bcrypt = require("bcrypt");
var Promise = require("bluebird");
var config = require("../config");
Promise.promisifyAll(bcrypt);
/**
 * 加盐加密
 * @param password {string} 原始密码
 * @return hash {object} 加密密码
 * @author gh
 */
var encrypt = async function(password) {
    var salt = await bcrypt.genSaltAsync(config.password.saltTimes);
    var hash = await bcrypt.hashAsync(password, salt);
    return hash;
};
/**
 * 密码对比
 * @param password {string} 原始密码
 * @param hash {string} 加密密码
 * @return res {boolean} 比对结果 true:密码匹配 | false:密码不匹配
 * @author gh
 */
var validate = async function(password, hash) {
    var res = await bcrypt.compareAsync(password, hash);
    return res
};
module.exports = {
    encrypt,
    validate
}

test 测试用例文件夹

util 工具类的封装

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18997.html

相关文章

  • 基于koa2开发用户中心

    摘要:加盐加密原始密码加密密码密码对比原始密码加密密码比对结果密码匹配密码不匹配测试用例文件夹工具类的封装 Ucenter github API doc 版本 version content date v0.1.0 项目迁移构建 17.04.23 v0.2.0 支持通过github授权登录 17.05.23 model设计 redis app.js key...

    davidac 评论0 收藏0
  • 【完结汇总】iKcamp出品基于Koa2搭建Node.js实战共十一堂课(含视频)

    摘要:云集一线大厂有真正实力的程序员团队云集一线大厂经验丰厚的码农,开源奉献各教程。融合多种常见的需求场景网络请求解析模板引擎静态资源日志记录错误请求处理。结合语句中转中间件控制权,解决回调地狱问题。注意分支中的目录为当节课程后的完整代码。 ??  与众不同的学习方式,为你打开新的编程视角 独特的『同步学习』方式 文案讲解+视频演示,文字可激发深层的思考、视频可还原实战操作过程。 云...

    sPeng 评论0 收藏0
  • 开始连载啦~每周2更共11堂iKcamp课|基于Koa2搭建Node.js实战项目教学(含视频)|

    摘要:玩转同时全面掌握潮流技术采用新一代的开发框架更小更富有表现力更健壮。融合多种常见的需求场景网络请求解析模板引擎静态资源日志记录错误请求处理。结合语句中转中间件控制权,解决回调地狱问题。注意分支中的目录为当节课程后的完整代码。 ??  与众不同的学习方式,为你打开新的编程视角 独特的『同步学习』方式 文案讲解+视频演示,文字可激发深层的思考、视频可还原实战操作过程。 云集一线大厂...

    B0B0 评论0 收藏0
  • iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备

    安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 showImg(https://segmentfault.com/img/remote/1460000012470016?w=1214&h=718); 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await 等新语法,所以请保证 node 环境在 7.6...

    bang590 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<