用户认证方式的选择

一般写后端如果存在用户系统的话,就存在用户认证的问题,即通过验证确定用户身份。

Session Based Auth vs Token Based Auth

1. 基于session的认证方式

一直以来大部分网站使用的用户认证方式都是基于session的,这种方式服务端基于session存储用户认证信息,浏览器存储下发的sessionid,当发起请求是带上sessionid,服务端根据sessionid判断用户身份。因为请求会比较频繁,一般session都通过memcache或redis存储。

这种认证方式被广泛用于网站的用户认证中,我认为这跟浏览器cookie机制这一特性也是密不可分的,具体实现是这样的:服务端认证通过后在response的header中设置set-cookie的值,可以把sessionid设置到浏览器本地的cookie中,而在浏览器中发起请求时,会将浏览器cookie中的sessionid放置到request的header中,这样服务端根据请求header中sessionid就可以完成对用户的认证。

不过现在很多api服务往往是同时给网站和app调用的,app不和浏览器一样具有cookie机制,这种session授权方式直接给app用,并不能无缝对接。另外,对session的存储和维护也是比较麻烦的一个问题,尤其是当网站规模较大或用户量较大的情况下。这个时候我更倾向于使用基于token的用户认证方式。

2. 基于token的认证方式

基于token的用户认证是一种服务端无状态的认证方式,就是说服务端不用存放token数据。服务端只是生成token和验证token,客户端负责保存token。token数据一般带上用户相关信息,比如用户id或用户名之类的,另外再附加上过期信息。这样客户端带上token发起请求后,服务端就可以直接根据token确定用户身份了,另外也能够判断用没有过期。

基于token的认证方式相对基于session的认证的优点有:

  • 服务端无状态

    服务端不用存储token数据,因为生产的token本身就是自包含的,可以根据token验证用户信息。

  • 原生app同样适用

    不论浏览器还是原生app,发起认证后的请求都讲token放到请求的header中,原生app不需要迁就浏览器特性做特别处理。

  • 防CSRF ...

详情 ...

Promise的使用

前段时间写h5页面,接触到了一个叫Promise的东西。当时以为就是一个简单的封装使用回调函数的一个组件,但是使用后才发现,貌似Promise针对回调函数是异步处理的,并且对异步处理对象和处理规则进行了规范化。前不久通过的ECMAScript 6语言标准中就新增了Promise这一语言特性,所以以后Promise的使用会变得越来越普遍。以下主要针对ES6 Promise标准来介绍下Promise的一些用法。

1. 基本概念

Promise的使用主要涉及到构造函数、实例方法和静态方法三方面:

1.1 构造函数

构造Promise对象时,需要传入一个函数对象作为参数,

var promise = new Promise(function(resolve, reject) {
    // 异步处理
    // 处理结束后、调用resolve 或 reject
});

函数对象带有两个参数resolve和reject也分别是执行函数。区别是resolve在上面的过程处理成功是调用,而reject在处理出错或异常时调用。当然上面说的都是人为调用的,所以其实处理不成功调用resolve也是可以的。但如果function内不调用两个函数,function函数执行正常会默认调用resolve的效果,而出现异常则会默认调用reject的效果。

1.2 实例方法

Promise的实例对象主要有两个常用的方法:promise.then()和promise.catch()。

1.2 ...
详情 ...