我已经实现了一个身份验证方案,它模仿了 Amazon 在我的 Django Web 服务上使用 S3 所做的事情。每个请求都使用秘密进行签名。要签名的字符串包括正在访问的资源的 URL。
例如,如果客户端向http://myservices.org/users发出 GET 请求,则客户端必须构造一个string_to_sign
包含http://myservices.org/users
. 当服务器处理请求时,它还将构造一个string_to_sign
并且可以包含相同的 URL,基于它从 WSGI 包装器请求对象中学习到的信息。
我的问题是,当客户端决定包含端口号(例如http://myservices.org:80/users
)时,服务器代码构造不正确string_to_sign
,因为我不知道如何获取客户端使用的实际 URL。WSGI 包装器不会让我知道 URL 包含端口号。
有没有办法让 Django 应用程序学习作为 HTTP 请求一部分的实际 URL?我是否需要设置某种位于 WSGI 包装器前面的请求处理程序才能访问原始 HTTP 请求并自己拉出 URL?