登陆的业务逻辑
{
http:是短链接.
服务器如何判断当前用户是否登陆?
// 1. 若是是即时通讯类:长链接.
// 如何保证服务器跟客户端保持长链接状态?
html
// "心跳包" 用来检测用户是否在线!用来作长链接!ios
http:短链接使用token 机制来验证用户安全性web
// token 值: 登陆令牌! 用来判断当前用户的登陆状态!
// token 值特色: 是一个字符串/大整数,只须要保证惟一性.是服务器根据用户的信息(帐号/密码/身份认证机制(电话号/身份证号/支付宝帐号/银行卡信息)...)来生成的用于标识用户身份的值!
// token 值获取:
数据库
// 当用户首次登陆成功以后, 服务器端就会生成一个 token 值. api
1.会在服务器保存token值(保存在数据库中) 缓存
2.将这个token值返回给客户端.安全
// 客户端拿到 token 值以后,通常保存在两个位置 : 服务器
1. 将 token 保存在 cookie 中;cookie
2.将 token 保存在沙盒中,做为一个公共参数传递.网络
// 公共参数: 每个网络请求都须要的参数! 通常公共参数有不少都是"可选"参数!,公共参数附带的越多,越利于后台监测用户,数据挖掘会使用到监测到的数据.
// 之后客户端再次发送网络请求(通常不是登陆请求)的时候,就会将这个 token 值附带到参数中发送给服务器.
// 服务器接收到客户端的请求以后,会取出token值与保存在本地(数据库)中的token值作对比!
// 若是两个 token 值相同 :说明用户登陆成功过!当前用户处于登陆状态!
// 若是没有这个 token 值, 没有登陆成功.
// 若是 token 值不一样: 说明原来的登陆信息已经失效,让用户从新登陆.
// token 值失效问题: 1. token 值有失效时间!
{
token的有效时间:
{
1. 若是 app 是新闻类/游戏类/聊天类等须要长时间用户粘性的. 通常能够设置1年的有效时间!
2. 若是 app 是 支付类/银行类的. 通常token只得有效时间比较短: 15分钟左右!
}
}
// token 值失效问题: 2. token 值用来作设备惟一性登陆判断!
{
每次登陆以后,不管用户密码是否改变,只要调用登陆接口而且登陆成功,都会在服务器生成新的token值,原来的token值就会失效!
典型的 app : 打车软件类
}
拓展: 多态设备同时登陆. 设备惟一性登陆!
{
若是容许多台设备同时登陆 ,而且能够设置最大的登陆数量的时候。好比说QQ:容许在电脑客户端登陆,QQ手机端登陆, QQ网页端登陆
若是超出这三个端 想要再另外 一个相同的端登陆,须要使对应的端的token失效,来保证一个端 一个帐号只登陆一次。
能够设置多个token 根据登陆端不一样 ,来检测token 是否过时。 根据登陆的数量 能够判断最大支持多少个设备同时登陆
}
}
一,OAuth2.0受权协议:
简述:一种安全的登录协议,用户提交的帐户密码不提交到本APP,而是提交到受权服务器,待服务器确认后,返回本APP一个访问令牌,本APP便可用该访问令牌访问资源服务器的资源。因为用户的帐号密码并不与本APP直接交互,而是与官方服务器交互,于是它是安全的。
图示:
流程:
1,获取未受权的Request Token。
url:request token url。
param:appKey/appSecret,签名方法/签名(如HMAC-SHA1),timeStamp(时间戳:距1970/0/0/0/0/0的秒数),nonce(随机生成的string,防止重复请求)
response:Oauth_Token/Oauth_Secret
2,获取用户受权的Request Token。
url:user authorizition url。
param:Oauth_Token(上个步骤返回的令牌),callback_url(受权成功后返回的地址)
response:Oauth_Token(被用户受权或否决的令牌)
3,用已受权的Request Token换取AccessToken。
url:access token url。
param:appKey,Oauth_Token(上个步骤返回的令牌),签名,TimeStamp,nonce
response:Access_Token/Secret
二,新浪微博的implementation(以ios sdk为例)。
1,先封装下列参数:
NSDictionary *params = [NSMutableDictionarydictionaryWithObjectsAndKeys:
self.appKey, @"client_id",
@"code", @"response_type",
self.appRedirectURI, @"redirect_uri",
@"mobile", @"display", nil];
appKey和AppSecret在申请第三方APP的时候便可获得。appRedirectURI只对网页应用有效,因此这里能够随便填一个或者使用默认的。
response_type为code表面其但愿返回的是一个受权码(至关于上述的未受权的Request Token)。
display应该是指该请求是移动app的请求。
而后启动一个WebView,请求url:https://open.weibo.cn/2/oauth2/authorize,带上述参数,方法为get。
造成的url如:https://open.weibo.cn/2/oauth2/authorize?client_id=1213792051&response_type=code&
redirect_uri=https%3A%2F%2Fapi.weibo.com%2Foauth2%2Fdefault.html&display=mobile
接着就进入了要求输入帐号密码的页面
输入帐号密码后,以post方式往https://open.weibo.cn/2/oauth2/authorize发送请求
出现受权或请求的按钮,至此完成第一部分。
疑问:协议中的未受权的request token在这里是哪一个实体?仍是新浪把它弱化掉了,也多是缓存在webview中。
2,点击受权按钮以后,就能够获得Authorization Code了,该受权码至关于以受权的Request Token。
3,封装参数
NSDictionary *params = [NSDictionarydictionaryWithObjectsAndKeys:
self.appKey, @"client_id",
self.appSecret, @"client_secret",
@"authorization_code", @"grant_type",
self.appRedirectURI, @"redirect_uri",
code, @"code", nil];
请求url:https://open.weibo.cn/2/oauth2/access_token,方法post,加上述参数,经过NSURLConnection发送请求
返回的data就包含access token,固然会判断下该token是否还合法,有效,过时,成功的话会save住下面4个字段。
NSString *access_token = [authInfo objectForKey:@"access_token"];
NSString *uid = [authInfo objectForKey:@"uid"];
NSString *remind_in = [authInfo objectForKey:@"remind_in"];
NSString *refresh_token = [authInfo objectForKey:@"refresh_token"];
4,之后在请求资源时,就会加上access_token了。
三,SSO技术。
简述:SSO全场Single Sign On,用户只需登录一次便可访问相互信任的子系统。用户访问系统1时,登录成功后会返回一个ticket,当用户访问系统2时,会把ticket带上,待验证合法后便可访问系统2。听起来跟cookie有点像,没错,Web-SSO便有基于cookie的实现方案。不少手机APP在点击新浪受权时,会跳到新浪客户端的登录页面,这里就用到SSO技术啦。
在本APP受权新浪微博时,会先检测手机是否安装了新浪微博客户端。
[[UIApplicationsharedApplication] openURL:xxx]能够打开另外一个APP。这里sinaweibosso://login为客户端的url并传递三个参数,AppKey,RedirectURI,ssoCallbackScheme。
ssoCallbackScheme是返回的App Url地址,即本身定义的sinaweibosso.appKey。
登录成功后,客户端会直接把AccessToken返回给本App。至于在客户端那边发生了哪些交互,暂时不得而知。