登录的业务逻辑
{
    http:是短连接.
    
     服务器如何判断当前用户是否登录?
    
    // 1. 如果是即时通信类:长连接.
    // 如何保证服务器跟客户端保持长连接状态?

// "心跳包" 用来检测用户是否在线!用来做长连接!

http:短连接使用token 机制来验证用户安全性

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

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

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

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

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

1. 将 token 保存在 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。至于在客户端那边发生了哪些交互,暂时不得而知。  

使用token机制来验证用户的安全性-b的更多相关文章

  1. IOS 中使用token机制来验证用户的安全性

    登录的业务逻辑{    http:是短连接.         服务器如何判断当前用户是否登录?    // 1. 如果是即时通信类:长连接.    // 如何保证服务器跟客户端保持长连接状态? // ...

  2. (html)前端如何验证token的合法性来判断用户是否登录?

    问题: (html)前端如何验证token的合法性来判断用户是否登录?描述: 1.我使用了JWT的方式,后端生成了一个token,将其返回给前端,前端获取到后每次请求接口都附带上这个token,后端来 ...

  3. 为什么每个请求都要有用户名密码呢,那不是每次都要查询一下了,token,表示这个用户已经验证通过了,在token有效期内,只需要判断token是否有效就可以了

    为什么每个请求都要有用户名密码呢,那不是每次都要查询一下了,token,表示这个用户已经验证通过了,在token有效期内,只需要判断token是否有效就可以了

  4. 前后端token机制 识别用户登录信息

    Token,就是令牌,最大的特点就是随机性,不可预测.一般黑客或软件无法猜测出来. 那么,Token有什么作用?又是什么原理呢? Token一般用在两个地方: 1)防止表单重复提交. 2)anti c ...

  5. js用正则表达式验证用户和密码的安全性,生成随机验证码

    制作了一个表单,表单验证用户.密码.随机验证码 html页面

  6. 基于token机制鉴权架构

    常见的鉴权方式有两种,一种是基于session,另一种是基于token方式的鉴权,我们来浅谈一下两种 鉴权方式的区别. 两种鉴权方式对比 session 安全性:session是基于cookie进行用 ...

  7. Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结

    Atitit HTTP认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结 1.1. 最广泛使用的是基本验证 ( ...

  8. javaEE开发中使用session同步和token机制来防止并发重复提交

    javaEE开发中使用session同步和token机制来防止并发重复提交 通常在普通的操作当中,我们不需要处理重复提交的,而且有很多方法来防止重复提交.比如在登陆过程中,通过使用redirect,可 ...

  9. JavaWeb—基于Token的身份验证

    传统身份验证的方法 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RES ...

随机推荐

  1. SpringMVC项目接入Springfox实战遇到的问题集合

    为了方便的管理项目中API接口,目前总是会写好接口后,然后又要去维护一个文档,这对于开发者来说太心累了, 在网上找了好多关于API接口管理和生成文档的资料,一次偶然跟51的大神交流发现了Swagger ...

  2. 【设计模式 - 23】之模版方法模式(Template)

    1      模式简介 模版方法模式的定义: 模版方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 模版方法模 ...

  3. sublimeText3安装package control和禁止弹出更新下载弹窗

    1.sublimeText3安装package control import urllib.request,os; pf = 'Package Control.sublime-package'; ip ...

  4. Mac OS X 中安装JDK7

    1. 下载 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 当前版本1.7.0_ ...

  5. mybatis09

    1mybatis开发dao的方法 .1SqlSession作用范围 是使用局部变量.成员变量,还是形参? 1.1.1SqlSessionFactoryBuilder SqlSessionFactory ...

  6. LINUX系统全部参数 sysctl -a + 网络参数设置

    http://blog.lifeibo.com/?p=380 1.sysctl sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中 [root@ser ...

  7. verview of Spring Framework--转

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/overview.html 2. Introduct ...

  8. GUI编程笔记(java)07:GUI把文本框的值移到文本域案例

    1.首先我们了解一下我们的需求,如下: 输入“风清扬”,点击“数据转移”,这样的文本会出现到下面的文本域中,这就是我们的需求. 2.代码如下: package cn.itcast_05; import ...

  9. docker build lnmp(未完成。。。)

    docker pull centos # 拉取镜像到本地 docker run -i -t -p 8000:80 --name=centosDev centos cat /etc/redhat-rel ...

  10. JS 自定义回调函数callback

    1 应用场景:js的异步加载,在get,post,ajax异步加载的时候,可能对应的请求没有完成,这时需要使用请求回来的数据作为参数调用其他函数,这时就需要使用回调函数. 2 回调函数作用:等待函数调 ...