远程鉴权

远程鉴权功能是一种访问控制功能,用于保护资源。远程鉴权是指对发送到阿里云CDN边缘节点上的用户请求进行校验,并根据鉴权服务器返回的校验结果来判断如何处理用户的请求。开启远程鉴权意味着资源只能被授权成功的用户访问。本文介绍远程鉴权的实现原理及控制台开启远程鉴权步骤,并提供相关API参考。

实现原理

视频点播服务同时支持URL鉴权和远程鉴权功能以避免站点资源被非法下载或盗用。这两个功能在技术实现方案上有如下差异:

  • URL鉴权:您把域名的鉴权规则下发给CDN节点,由CDN节点完成鉴权的整个数据交互流程。更多关于URL鉴权的信息,请参见URL鉴权

  • 远程鉴权:您需要有自己单独设置的鉴权服务器,CDN节点收到需要鉴权的用户请求后,需要把用户请求转发给鉴权服务器完成鉴权,鉴权服务器由您自主管理。

远程鉴权的实现原理如下:远程鉴权原理图

  1. 用户发起的资源访问请求到达CDN节点,请求中携带了鉴权参数。

  2. CDN节点收到用户请求,将用户请求转发给鉴权服务器。

  3. 鉴权服务器根据用户请求中携带的鉴权参数给出鉴权结果,并返回给CDN节点。

  4. CDN节点根据鉴权服务器返回的鉴权结果来判断如何处理用户的请求。鉴权成功即允许访问,鉴权失败会拒绝访问或进行相应的限制。鉴权结果举例说明如下:

    • 举例1:鉴权成功,CDN节点与用户开始正常的缓存数据访问交互。

    • 举例2:鉴权失败,CDN节点返回403状态码给用户。

    • 举例3:鉴权失败,CDN节点对用户访问进行限速。

    • 举例4:鉴权超时,CDN节点执行鉴权超时的默认动作,即放行用户请求。

使用说明

开启远程鉴权功能后,用户的每次请求都要鉴权,当请求访问量大时,需考虑鉴权服务器的压力和性能。

操作步骤

  1. 登录视频点播控制台

  2. 在点播控制台左侧导航栏选择配置管理

  3. 单击分发加速配置 > 域名管理,进入域名管理页面。

  4. 选择您要配置的域名,单击配置

  5. 单击访问控制

  6. 单击远程鉴权页签。

  7. 开启远程鉴权,配置远程鉴权信息。2021-12-27_15-00-00

    2021-12-30_11-11-03参数和说明如下表所示:

    参数

    说明

    鉴权服务器地址

    鉴权服务器对外可以访问的地址。系统会对您输入的鉴权服务器地址进行校验,包括格式校验和值校验。

    • 格式要求

      格式必须为以下几种类型之一:

      • http://example.com/auth

      • https://example.com/auth

      • http://192.0.2.1/auth

      • https://192.0.2.1/auth

    • 值要求

      值不能包含127.0.0.1和localhost,因为这类本地地址属于无效地址。

    请求方法

    鉴权服务器支持的请求方法。支持GETHEADPOST这三种请求方法。

    • POST

      • 参数在请求体中传输,地址栏不变。

      • 理论上没有限制数据传输的大小。

      • 请求不会被缓存,也不会被保留在浏览器历史记录中。

      • 安全性相对较高。

    • GET

      • 参数在请求行中传输,地址栏会显示提交的参数值。

      • 受浏览器限制,数据传输最大支持1024字节。

      • 请求可被缓存,也会被保留在浏览器历史记录中。

      • 安全性相对较低。

    • HEAD

      HEAD和GET方法相同,只是服务器响应时,HEAD不返回请求体。

    鉴权文件类型

    • 所有文件类型:所有的文件类型都参与鉴权。

    • 指定文件类型:仅指定的文件类型参与鉴权。

      • 指定文件类型时,多个文件类型用竖线(|)分隔,例如:mp4|flv。

      • 文件类型区分大小写,即jpg和JPG是两种不同的文件类型。

    保留参数设置

    用于控制用户请求URL中需要参与鉴权的参数。可以选择保留所有参数保留指定参数删除所有URL参数

    • 保留指定参数时,多个参数用竖线(|)分隔,例如:user|token。

    • 参数区分大小写,即key和KEY是两种不同的参数。

    添加自定义参数

    为CDN节点转发给鉴权服务器的请求URL添加自定义参数。

    您可以选择自定义设置参数和取值,也可以选择选择参数直接使用点播控制台上预设的变量。

    • 自定义设置参数和取值时,要求如下:

      • 多个参数用竖线(|)分隔,例如:token=$arg_token|vendor=ali_cdn。

      • 参数区分大小写,即key和KEY是两种不同的参数。

    • 使用预设变量时,您可以提取变量的值添加到CDN转发给鉴权服务器的请求上。

      例如,选择提取变量$http_host,则用户请求的URL地址会加上host=$http_host,此处的host表示用户请求头中的host值。变量名称与变量含义的介绍,请参见变量名称

    保留请求头设置

    用于控制用户请求头中需要参与鉴权的参数。可以选择保留所有参数保留指定参数删除所有请求头参数

    • 保留指定参数时,多个请求头用竖线(|)分隔,例如:user_agent|referer|cookies。

    • 参数不区分大小写,即http_remote_addr和HTTP_Remote_Addr为同一个参数。

    说明

    选择保留所有参数时,CDN节点默认会删除HOST头,如果您需要保留HOST头,可通过保留指定参数或者添加自定义参数来保留。CDN节点默认删除HOST头的原因是CDN节点转发给鉴权服务器的鉴权请求中携带的HOST头是加速域名,这可能会导致鉴权服务器无法识别鉴权请求,从而导致访问404、鉴权失败。

    添加自定义参数

    为CDN节点转发给鉴权服务器的请求头添加自定义参数。

    您可以选择自定义来设置参数和取值,也可以选择选择参数直接使用点播控制台上预设的变量。

    • 自定义设置参数和取值时,要求如下:

      • 多个请求头用竖线(|)分隔,例如:User-Agent=$http_user_agent|vendor=ali_cdn。

      • 参数不区分大小写,即http_remote_addr和HTTP_Remote_Addr为同一个参数。

    • 使用预设变量时,您可以提取变量的值添加到CDN转发给鉴权服务器的请求上。

      例如,选择提取变量$http_host,则用户请求的URL地址会加上host=$http_host,此处的host表示用户请求头中的host值。变量名称与变量含义的介绍,请参见变量名称

    鉴权成功状态码

    鉴权服务器在鉴权成功时返回的HTTP状态码,即鉴权结果。建议鉴权成功状态码设置为2XX。

    例如,将鉴权成功状态码设置为200,当鉴权服务器返回200时,表示鉴权成功。如果鉴权服务器返回的状态码不是成功状态码,也不是失败状态码,结果即为鉴权超时。

    鉴权失败状态码

    鉴权服务器在鉴权失败时返回的HTTP状态码,即鉴权结果。建议鉴权失败状态码设置为4XX。

    例如,将鉴权失败状态码设置为403,当鉴权服务器返回403时,表示鉴权失败。如果鉴权服务器返回的状态码不是成功状态码,也不是失败状态码,结果即为鉴权超时。

    响应自定义状态码

    鉴权服务器返回鉴权失败状态码给CDN节点,即用户请求鉴权失败时,CDN节点返回给用户的状态码。

    例如,将响应自定义状态码设置为403,当用户请求鉴权失败时,CDN节点会返回403给用户。

    超时时长

    统计的是从CDN节点发起鉴权请求开始,到CDN节点收到鉴权服务器返回的结果为止的时间。

    单位为毫秒,最长可以设置为3000毫秒。

    超时之后的动作

    CDN节点与鉴权服务器之间的数据交互超时后,CDN节点对用户请求的处理。取值:

    • 放行:鉴权超时,CDN节点将直接放行用户的请求。

    • 拒绝:鉴权超时,CDN节点将返回上面配置的响应自定义状态码给用户。

  8. 单击确定,完成配置。

    成功配置远程鉴权功能后,您可以在远程鉴权页签下,对当前的配置进行修改或关闭远程鉴权功能。

变量名称

添加自定义参数时,您可以选择直接使用点播控制台上预设的变量。变量名称与变量含义见下表。

变量名称

变量含义

$http_host

请求头中的host值。

$http_user_agent

请求头中的user_agent值。

$http_referer

请求头中的referer值。

$http_content_type

请求头中的content_type值。

$http_x_forward_for

请求头中的x_forward_for值。

$remote_addr

请求的client ip信息。

$scheme

请求的协议类型。

$server_protocol

请求的协议版本。

$uri

请求的原始uri。

$args

请求的Query String,不包含问号(?)。

$request_method

请求方法。

$request_uri

uri+'?'+args的内容。

相关API

批量配置域名