zoukankan      html  css  js  c++  java
  • MQTT 与auth

    一.MQTT介绍

    1.简介

    MQTT(message queuing telemetry transport)是IBM开发的即时通讯协议,是一种发布/订阅极其轻量级的消息传输协议,专门为网络受限设备、低宽带以及高延迟和不可靠的网络而设计的。由于以上轻量级的特点,是实现智能家居的首选传输协议,相比于XMPP,更加轻量级而且占用宽带低。

    2.特点

    a.由于采用发布/订阅的消息模式,可以提供一对多的消息发布
    b.轻量级,网络开销小
    c.对负载内容会有屏蔽的消息传输
    d.有三种消息发布质量(Qos):
    qos=0:“至多一次”,这一级别会发生消息丢失或重复,消息发布依赖于TCP/IP网络
    qos=1:“至少一次”,确保消息到达,但消息重复可能会发生
    qos=2:“只有一次”,确保消息到达一次
    e.通知机制,异常中断时会通知双方

    3.原理

     
    14523188625918865.png

    MQTT协议有三种身份:发布者、代理、订阅者,发布者和订阅者都为客户端,代理为服务器,同时消息的发布者也可以是订阅者(为了节约内存和流量发布者和订阅者一般都会定义在一起)。
    MQTT传输的消息分为主题(Topic,可理解为消息的类型,订阅者订阅后,就会收到该主题的消息内容(payload))和负载(payload,可以理解为消息的内容)两部分。

    -----------------------------------------------


    Auth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。目前Auth2.0已经得到了广泛应用,比如微信登录、微博、QQ等。

    一、为什么要使用OAuth
    为了理解OAuth的适用场合,让我举一个假设的例子。
    有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让"云冲印"读取自己储存在Google上的照片。
    问题是只有得到用户的授权,Google才会同意"云冲印"读取这些照片。那么,"云冲印"怎样获得用户的授权呢?
    传统方法是,用户将自己的Google用户名和密码,告诉"云冲印",后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。
    (1)"云冲印"为了后续的服务,会保存用户的密码,这样很不安全。
    (2)Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。
    (3)"云冲印"拥有了获取用户储存在Google所有资料的权力,用户没法限制"云冲印"获得授权的范围和有效期。
    (4)用户只有修改密码,才能收回赋予"云冲印"的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。
    (5)只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。

    OAuth就是为了解决上面这些问题而诞生的。

    二、OAuth2.0授权流程
    关于OAuth2.0协议的授权流程可以参考下面的流程图

    其中Client指第三方应用,Resource Owner指用户,Authorization Server是我们的授权服务器,Resource Server是API服务器。

    解释一下上述流程:

    (A)用户打开客户端以后,客户端要求用户给予授权。
    (B)用户同意给予客户端授权。
    (C)客户端使用上一步获得的授权,向认证服务器申请令牌。
    (D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
    (E)客户端使用令牌,向资源服务器申请获取资源。
    (F)资源服务器确认令牌无误,同意向客户端开放资源。

    三、授权模式
    客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。
    授权码模式(authorization code)
    简化模式(implicit)
    密码模式(resource owner password credentials)
    客户端模式(client credentials)

    四、授权码模式
    授权码模式(authorization code)是功能最完整、流程最严密的授权模式。

    它的步骤如下:
    (A)用户访问客户端,后者将前者导向认证服务器。
    (B)用户选择是否给予客户端授权。
    (C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
    (D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
    (E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。


    下面是上面这些步骤所需要的参数。
    A步骤中,客户端申请认证的URI,包含以下参数:
    response_type:表示授权类型,必选项,此处的值固定为"code"
    client_id:表示客户端的ID,必选项
    redirect_uri:表示重定向URI,可选项
    scope:表示申请的权限范围,可选项
    state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。

    下面是一个例子。

    [html] view plain copy
    GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz  
            &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1  
    Host: server.example.com  
    C步骤中,服务器回应客户端的URI,包含以下参数:
    code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
    state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
    下面是一个例子。
    [html] view plain copy
    HTTP/1.1 302 Found  
    Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA  
              &state=xyz  
    D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:
    grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
    code:表示上一步获得的授权码,必选项。
    redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
    client_id:表示客户端ID,必选项。
    下面是一个例子。

    [html] view plain copy
    POST /token HTTP/1.1  
    Host: server.example.com  
    Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW  
    Content-Type: application/x-www-form-urlencoded  
      
    grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA  
    &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb  

    E步骤中,认证服务器发送的HTTP回复,包含以下参数:
    access_token:表示访问令牌,必选项。
    token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
    expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
    refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
    scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。

    下面是一个例子。

    [html] view plain copy
    HTTP/1.1 200 OK  
        Content-Type: application/json;charset=UTF-8  
        Cache-Control: no-store  
        Pragma: no-cache  
      
        {  
          "access_token":"2YotnFZFEjr1zCsicMWpAA",  
          "token_type":"example",  
          "expires_in":3600,  
          "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",  
          "example_parameter":"example_value"  
        }  
    Refresh Token 是 Access Grants 的一种,在获取 Access Token 时,认证服务器将返回相应的 Refresh Token,如果 Access Token 过期,就可以用 Refresh Token 去刷新。

    一般针对移动应用时,在返回access_token时会返回refresh_token。refresh_token 也是有有效期的,当refresh_token失效的后,需要用户重新授权。

    refresh_token失效后,可重新获取。
    首选需要用户授权,获取code后获取refresh_token,包含参数:

    client_id:表示客户端的ID,必填项

    grant_type:固定值 ,填refresh_token , 必填项

    refresh_token:填写通过access_token获取到的refresh_token参数,必填项。

  • 相关阅读:
    GNU make manual 翻译(九十九)
    GNU make manual 翻译( 九十五)
    Shell的 for 循环小例子
    makefile中对目录遍历的小例子
    GNU make manual 翻译(九十三)
    GNU make manual 翻译( 一百)
    GNU make manual 翻译( 九十七)
    GNU make manual 翻译( 九十八)
    mapserver4.8.3 的readme.win32的中文翻译文件
    遥控器编程
  • 原文地址:https://www.cnblogs.com/try-chi/p/12709251.html
Copyright © 2011-2022 走看看