关于登陆,现在的网站有第三方登陆(qq,微信,微博), 手机号登陆,用户名密码登陆,sso登陆,找回密码,注销 感觉其实都差不多
第三方登陆
其实国内的大多数第三方登陆都是基于oauth 2.0的变种,同理还有微信上消息more按钮点击能跳转到公司网站同样实现登陆都是基于这个,那什么是oauth2.0呢,阮老师这篇文章讲解的很清楚oauth2.0,而我们用的更多的又是其中的授权码模式,大致逻辑如下
其中比较重要的两点就是用户授权code和access_token, code作用代表用户同意登陆了,access_token 代表这个用户资源(有时候像之前的小程序,是拿着用户同意之后返回的code 去换回openid, 这个openid 类似这个access_token, 他在每个应用中是唯一的,代表了一个用户,如果我们想把不同app上同一个微信用户绑在一起,需要我们去微信联合平台绑定需要处理的app,然后下次请求的时候会返回一个unit id ,这个对于同一个微信用户在不同的app内部是唯一的)
for example 微信消息跳转itbasic网站
1.引导用户点击授权链接,微信给的授权链接上会有参数绑定回调地址和state参数,当用户点击的时候,微信会重定向(注意不是回调)填写的会掉地址,并携带参数state,还有code ,也就是用户授权码,下面是我们的重定向地址代码
2.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32public function dologin($req)
{
$code = $req->param('code'); # 用户授权码
$state = $req->param('state'); # 自己定义的参数,比如这次登陆来自微信,或者登陆之后需要跳转的地址
$accesstoken = $this->getAccessToken(); # 微信这块的access_token不需要用户的授权即可获取,但后面获取用户信息还是需要授权码,所以原理和上面是一样的
$url = 'https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token='.$accesstoken.'&code='.$code;
$res =$this->http($url); #获取用户信息
if (!array_key_exists('UserId', $res['result'])) {
// 记录错误信息(微信)到日志,获取用户信息出错
}
// 根据实际业务处理,我这块是登陆
// 你可以根据返回的用户名称,判断是新用户,还是老用户,新用户的话会往数据库插入数据
$user_model = Box::getObject('user', model);
$res = $user_model->search($res['name']);
if (!$res) {
// 记录错误信息(itbaisc) 到日志,查找用户失败
}
$userinfo = $res;
$userinfo = ['userid' => $userinfo['id'], 'username' => $userinfo['username'], 'status' => $userinfo['status'], 'deptsid' => $userinfo['deptsid'], 'postsid' => $userinfo['postsid'], 'role' => $userinfo['role'], 'long' => true];
Session::set('userinfo', $userinfo); //实现登陆
$state = urldecode($state); // 之前我们自己绑定的参数,因为url在http参数中需要加密,防止多余的http这些参数
header( "Location: $state" );exit;
}
手机号登陆
首先生成验证码,存入缓存中,手机号=》验证码(过期时间,离开当前页面让其失效,只能使用一次),然后调用第三方接口发送给手机上这个验证码,用户收到验证码之后调用新的接口进行验证,我们在缓存中寻找手机号验证码是否匹配,如果匹配代表成功,后面是登陆啊,还是绑定啊看自己的业务需求
sso登陆
一处登陆处处登陆,一处注销,处处注销
(itbasic的原理类似oauth2。首先用户验证是否在的登陆中心登陆,如果没有,先登录,登陆中心成功后返回一个access_token,重定向到你来时候那个地址,相当于帮你发出请求,你拿着这个access_token获取用户信息,干啥都是你自己的事情。下次用户再来的时候,验证中心已经登陆上了,直接返回access_token然后重定向)
(注销,我们在每次去验证中心验证的时候,都记住有哪些来的网站,注销的时候都请求他们注销的地址就好了,这个时候可以直接请求,不用重定向,因为不用种cookie,直接销毁服务端数据就好了)
找回密码
通过邮箱。首先填写用户名和邮箱(为了防止别人恶意找回用户),确保用户名和邮箱和登陆的时候绑定一致,才发送修改密码的邮件,邮件内容是
这样其实就足够了,这个token 是我们之前发送邮件时候生成的,我们只需要保证 用户名 =>token,当用户请求这个接口的时候(注意一定是get请求,因为是点击),我们通过这个token,知道是哪个用户就好了,然后返回一个界面让用户修改密码就可以了.
熟悉了几个函数的使用
http_query_build ,拼接http请求参数(这个对url 好像还会进行urlencode加密)
parse_str, 把上面的拼接内容分开
当然上面各个案例的解决方案很多,比如找回密码用手机而不是用邮箱,只是简单记录下常用的方式