关于新浪云存储的权限问题Authorization

来源:互联网 发布:淘宝抵用券使用说明 编辑:程序博客网 时间:2024/06/05 09:33

最近在项目中用到的新浪云存储。可以把项目中涉及到的资源放到云里面存储,目前市面上比较多的,有阿里,新浪,百度,当然还有一些小众的云存储平台,比如说七牛,op等。

在官网上能够下载到各种语言的api.里面好多东西虽然在api里面已经给了实现,但是感觉不是很全面。

比如说签名:原始文档中提及到的三种方法(签名算法):

签名算法ssig:


三种认证方式如下:

  1. HTTP Request Header(Authorization)方式
  2. URL签名认证方式
  3. Cookie认证方式
但是实现起来只有第二种是api文档中给出具体实现的。

对于新浪里面的私有资源的获取方法,新浪的api里面给出的可以直接使用的方法只有URL认证方式。但是这种认证方法不够安全,相比之下httprequest认证authorization的方法比较安全,最近尝试了好多方法;

1, www-authorization认证,这是种简单的认证,需要用户输入用户名密码,然后把authorization的内容传到request header。

客户端请求
GET /private/index.html HTTP/1.0
Host: localhost

服务器端响应:
HTTP/1.0 401 Authorization Required <== 状态码
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:18:15 GMT
WWW-Authenticate: Basic realm=”Secure Area” <==必要值,realm的值可自定义
Content-Type: text/html
Content-Length: 311


2, header函数:添加authorization,可以成功,但是遗憾的是添加进入response header里面,仍旧不能获得权限,403错误

  • 客户端发送http请求
  • 服务器发现配置了http auth,于是检查request里面有没有"Authorization"的http header
  • 如果有,则判断Authorization里面的内容是否在用户列表里面,Authorization header的典型数据为"Authorization: Basic jdhaHY0=",其中Basic表示基础认证, jdhaHY0=是base64编码的"user:passwd"字符串。
  • 如果没有,或者用户密码不对,则返回http code 401页面给客户端
  • 标准的http浏览器在收到401页面之后,应该弹出一个对话框让用户输入帐号密码;并在用户点确认的时候再次发出请求,这次请求里面将带上Authorization header

一次典型的访问场景是:

  • 浏览器发送http请求(没有Authorization header)
  • 服务器端返回401页面
  • 浏览器弹出认证对话框
  • 用户输入帐号密码,并点确认
  • 浏览器再次发出http请求(带着Authorization header)
  • 服务器端认证通过,并返回页面
  • 浏览器显示页面

3, curl_setopt,这是网上说的比较多的,curl函数能轻易的实现解析网页,实现读取资源的功能。

请求示例:

curl -v -H "Range: bytes=0-1024" -H "Date: Sat, 20 Nov 2286 17:46:39 GMT" -H "Authorization: SINA <access_key>:<ssig>" "http://<Your-Bucket-Name>.sinacloud.net/<Object-Name>?formatter=json"

应用举例:

标准示例:

GET /my_bucket/path/to/my/file.txt?formatter=json HTTP/1.1Host: sinacloud.netDate: Sun, 1 Jan 2006 12:00:00 GMTAuthorization: SINA AccessKey:ssigRange: bytes=100-2048

响应:

HTTP/1.1 206 Partial Contentx-amz-id-2: idx-amz-request-id: request_idDate: dateLast-Modified: Sun, 1 Jan 2006 12:00:00 GMTETag: "etag"Content-Length: lengthContent-Type: typeConnection: closeServer: SinaS3x-amz-meta-foo: foo_value...file_content...其他的实现具体还是要看情况决定的。基本上看着api文档中的一些类方法就差不多够了。


0 0
原创粉丝点击