美文网首页
iOS用户登陆的逻辑

iOS用户登陆的逻辑

作者: 4c8ba49dc980 | 来源:发表于2016-11-15 14:13 被阅读515次

一.服务器如何判断当前用户是否登录?

 1. 如果是即时通信类:长连接.

如何保证服务器跟客户端保持长连接状态?"心跳包" 用来检测用户是否在线!用来做长连接!

2.如果http: 短连接使用token 机制

2.1.token 值: 登录令牌! 用来判断当前用户的登录状态!

2.2.token 值特点: 是一个字符串/大整数,只需要保证唯一性.是服务器根据用户的信息(账号/密码/身份认证机制(电话号/身份证号/支付宝账号/银行卡信息)...)来生成的用于标识用户身份的值!

2.3. token 值获取:  当用户首次登录成功之后, 服务器端就会生成一个 token 值.

a.会在服务器保存token值(保存在数据库中)

b.将这个token值返回给客户端.

c.客户端拿到 token 值之后,一般保存在两个位置 :

   将 token 保存在 cookie 中;

   将 token 保存在沙盒中,作为一个公共参数传递.

2.4.token值的作用

a. 公共参数: 每一个网络请求都需要的参数! 一般公共参数有很多都是"可选"参数!,公共参数附带的越多,越利于后台监测用户,数据挖掘会使用到监测到的数据.

b. 以后客户端再次发送网络请求(一般不是登录请求)的时候,就会将这个 token 值附带到参数中发送给服务器.

c.服务器接收到客户端的请求之后,会取出token值与保存在本地(数据库)中的token值做对比!

    如果两个 token 值相同 :说明用户登录成功过!当前用户处于登录状态!

    如果没有这个 token 值, 没有登录成功.

    如果 token 值不同: 说明原来的登录信息已经失效,让用户重新登录.

2.5. token 值失效问题: 

token的有效时间:

app 是新闻类/游戏类/聊天类等需要长时间用户粘性的. 一般可以设置1年的有效时间!

如果 app 是 支付类/银行类的. 一般token只得有效时间比较短: 15分钟左右!

2.6. token 值用来做设备唯一性登录判断!

每次登录之后,无论用户密码是否改变,只要调用登录接口并且登录成功,都会在服务器生成新的token值,原来的token值就会失效!

典型的 app : 打车软件类

2.7.拓展: 多态设备同时登录. 设备唯一性登录!

如果允许多台设备同时登录  ,并且可以设置最大的登录数量的时候。比如说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 = [authInfoobjectForKey:@"access_token"];

NSString*uid = [authInfoobjectForKey:@"uid"];

NSString*remind_in = [authInfoobjectForKey:@"remind_in"];

NSString*refresh_token = [authInfoobjectForKey:@"refresh_token"];

4,以后在请求资源时,就会加上access_token了。


相关文章

网友评论

      本文标题:iOS用户登陆的逻辑

      本文链接:https://www.haomeiwen.com/subject/emakpttx.html