MS RFC 42:支持cookies转发

日期

2008/03/26

作者

朱利安·塞缪尔·拉克鲁瓦

联系

Mapgears.com的jlacroix

最后编辑

2008/04/01

状态

通过2008/04/01-完成实施

版本

地图服务器5.2

概述

此RFC建议在执行OWS请求时扩展MapServer以转发HTTP cookie。

分布式服务器环境中的一种身份验证方法是使用HTTP cookie。Web服务器使用HTTP cookie来区分用户,并在导航期间维护与用户相关的数据,可能是跨多次访问和状态信息。从技术上讲,cookie是由Web服务器选择并发送到浏览器的任意数据块。浏览器将它们原封不动地返回到服务器。对MapServer的增强将允许应用程序将从客户端接收的任何HTTP cookie(从HTTP或HTTPS请求获取或发布)转发到MapServer将请求信息的任何其他服务器或服务。

这将要求MapServer在操作请求(级联)期间接收并转发任何cookie到新服务,例如(但不限于)WMS请求:GetMaps、GetFeatureInfo和WFS请求GetFeature。

实施方法

将在mapfile级别添加新的元数据(http_cookie_data),以临时存储http cookie数据。另一个元数据(OWS-HTTP-cookie)也将添加到层和映射文件级别,以控制cookie的使用。后者将设置为“转发”,以转发存储在HTTP cookie数据元数据中的cookie,或将其转发到硬编码cookie值,以仅转发此硬编码值。

元数据中的OWS-HTTP-cookie示例:

LAYER
  ...
  METADATA
    "ows_http_cookie" "forward" # This will forward the cookie sent to MapServer
  END
  ...

用户还可以直接传递cookie值,而不是传递给mapserver的cookie。要传递多个cookie,请使用以下语法:

LAYER
  ...
  METADATA
    "ows_http_cookie" "cookie1=my_value; cookie2=myvalue; " # This will forward the metadata value
  END
  ...

通过使用元数据配置,mapscript应用程序将能够通过设置正确的元数据来转发HTTP cookie。

目前,只有WMS和WFS代码将使用此代码,因为它们是MapServer请求外部Web服务器的唯一位置。

实施问题

在RFC审查期间指出,使用“http-cookie-data”元数据传递和存储cookie数据是对MapServer元数据机制的不良使用。

由于MapServer目前缺乏将应用程序状态信息关联到MapObj的机制,因此目前没有更好的机制来存储从客户端接收的cookie数据并将其传递给调用远程WMS的呈现代码。由于缺乏更好的解决方案,目前我们将使用本RFC中提出的“http_cookie_data”元数据,因为我们知道这是对元数据的糟糕使用,并且一旦有了更好的机制,可以在mapobj中存储和传递应用程序状态,那么该元数据将被否决,并由新的机制取代。钐。设置这个“http-cookie-data”元数据的mapscript应用程序的开发人员应该意识到这一点,并准备在未来的mapserver版本中更改他们的代码。

另一个问题是,目前计划不使用HTTP cookie数据元数据进行编码。格式不正确的元数据可能会破坏请求的HTTP头。如果发现curl不编码cookie值,则只允许32到126(可打印的ASCII字符)之间的字符。

对源代码的修改

HTTP cookie数据需要存储在新成员变量的cgirequestobj中,以便能够将其传递到mapfile。如果存在HTTP cookies,cookies将始终存储在那里。然后,如果设置了OWS的http_cookie元数据,那么mapserv.c主函数将在loadmap()函数之后和msowsdatch()之前负责mapfile中的http cookie。当为服务器请求准备URL时,wms和wfs代码将在httprequestobj中设置新创建的变量。

wms/wfs mspreparewmslayerrequest函数将检查层和映射对象中的ows-http-cookie元数据。如果该值设置为Forward,则HTTP cookie数据元数据的内容将作为HTTP cookie转发到WMS/WFS服务器。

curl作为curl_easy_setopt()函数中的一个选项,用于执行一个名为curlot_cookie的请求,以随请求发送cookie。

MapScript

通过在mapfile元数据中存储HTTP cookie数据,mapscript将能够使用这个新功能。下面是一个使用http cookie的php/mapscript示例:

foreach($_COOKIE as $szKey => $szValue)
{
    $szHTTPCookies .= "$szKey=$szValue; ";
}
$oMap->setMetadata("http_cookie_data", $szHTTPCookies);
$oMap->setMetadata("ows_http_cookie", "forward");
$oMap->draw();

文件影响

cgiutil.h           (add http_cookies in cgiRequestObj)
cgiutil.c           (read and store the http cookies data in cgiRequestObj)
maphttp.c           (send cookies with the request via curl option)
mapows.h            (add http_cookies to httpRequestObj)
mapserv.c           (store cookies in mapfile metadata)
mapwmslayer.c       (set cookies in httpRequestObj)
mapwfslayer.c       (set cookies in httpRequestObj)

向后兼容性

没有。

臭虫识别码

https://github.com/MapServer/MapServer/issues/2566

投票历史

2008/04/01通过,法兰克、丹妮尔姆、汤克和阿塞法伊的+1,杰夫姆和佩里克莱斯的+0。