常用的几种认证机制
HTTP Basic Auth
HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RESTful API使用的最简单的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。因此,在开发对外开放的RESTful API时,尽量避免采用HTTP Basic Auth
OAuth
OAuth(开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一web服务上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的第三方系统(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容
下面是OAuth2.0的流程:
Cookie Auth
Cookie认证机制就是为一次请求认证在服务端创建一个Session对象,同时在客户端的浏览器端创建了一个Cookie对象;通过客户端带上来Cookie对象来与服务器端的session对象匹配来实现状态管理的。默认的,当我们关闭浏览器的时候,cookie会被删除。但可以通过修改cookie
的expire time使cookie在一定时间内有效;
以上只是我在网上找的简单了解这几种认证方式,如想深入了解请自行Google
基于JWT的Token认证机制实现
什么是jwt
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
jwt的组成
一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。
{ "iss": "Online JWT Builder",
"iat": 1416797419,
"exp": 1448333419,
"aud": "www.example.com",
"sub": "jrocket@example.com",
"GivenName": "Johnny",
"Surname": "Rocket",
"Email": "jrocket@example.com",
"Role": [ "Manager", "Project Administrator" ]
}
iss: 该JWT的签发者,是否使用是可选的;
sub: 该JWT所面向的用户,是否使用是可选的;
aud: 接收该JWT的一方,是否使用是可选的;
exp(expires): 什么时候过期,这里是一个Unix时间戳,是否使用是可选的;
其他还有: nbf (Not Before):如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟;,是否使用是可选的;
JWT代码及实现流程
下载tp5–jwthttps://github.com/firebase/php-jwt
这些只是伪代码
1. 小程序请求登陆,及返回登陆信息与token(签名)
//用于登陆
public function login(){
$data = input('get.');
$store_model = new StoreModel;
$data["token"] = $this -> jwtEncode();//生成token
$login_data = $store_model -> judgeLogin($data);
return json($login_data);//返回登陆信息及token
}
//用于生成token数据并返回
public function jwtEncode(){
$type = config('jwt_type');
$key = config('jwt_key');
$token = array(
"iss" => "hahaha",//该JWT的签发者,用于后面的解密操作
"iat" => time(),//创建时间
"exp" => time()+7200//什么时候过期
);
$jwt = JWT::encode($token, $key);
return $jwt;
}
2.小程序登陆成功后,调用tp5中的接口,携带登陆时所获得的签名
public function _initialize(){
$this -> checkToken();
}
//解析token
public function checkToken(){
$request = Request::instance();
$jwtToken = $request -> header('Authorization');//获取小程序携带过来的签名token
if(!$jwtToken){
die("444");
}
$key = config('jwt_key');//解密秘钥
$type = config('jwt_type');//签名类型HS256
// JWT::$leeway = 10;//偏移时间
try{
$json = JWT::decode($jwtToken,$key,array($type));//解密签名token
return $json;
}catch(\Exception $exception){//如果解密失败,或者超过有效期则die
die("444");
}
}
参考第三方
https://github.com/firebase/php-jwt
http://www.cnblogs.com/xiekeli/p/5607107.html