对OSS的HTTP请求可以根据是否携带身份验证信息分为匿名请求和带身份验证的请求。匿名请求指的是请求中没有携带任何和身份相关的信息;带身份验证的请求指的是按照OSS API文档中规定的在请求头部或者在请求URL中携带签名的相关信息。

匿名请求流程

  1. 用户的请求被发送到OSS的HTTP服务器上。
  2. OSS根据URL解析出Bucket和Object。
  3. OSS检查Object ACL是否允许匿名访问。
    • 如果允许匿名访问,则返回Object的内容给用户。
    • 如果不允许匿名访问,则拒绝访问。

带身份验证的请求流程

  1. 用户的请求被发送到OSS的HTTP服务器上。
  2. OSS根据URL解析出Bucket和Object。
  3. OSS根据请求的OSS的AccessKeyId获取请求者的相关身份信息,进行身份鉴权。
    • 如果未获取成功,则拒绝访问,请求结束。
    • 如果获取成功,但请求者不被允许访问此资源,则拒绝访问,请求结束。
    • 如果获取成功,但OSS端根据请求的HTTP参数计算的签名和请求发送的签名字符串不匹配,则返回,请求结束。
    • 如果身份鉴权成功,则返回Object的内容给用户。

AccessKey类型

目前访问OSS使用的 AccessKey(AK)有三种类型。

  • 阿里云账号AK

    阿里云账号AK特指阿里云主账号的AK,每个阿里云账号提供的AccessKey对拥有的资源有完全控制的权限。每个阿里云账号能够同时拥有不超过5个active或者inactive的AK对(AccessKeyId和AccessKeySecret)。

    用户可以登录AccessKey管理控制台,申请新增或删除AK对。

    每个AK对都有active和inactive两种状态。

    • Active:表明用户的AK处于激活状态,可以在身份验证的时候使用。
    • Inactive:表明用户的AK处于非激活状态,不能在身份验证的时候使用。
    注意 为了您的数据安全,不建议直接使用阿里云账号AccessKey,您可以创建RAM子账号之后并授权后,使用子账号的AccessKey管理您的资源。
  • RAM子账号AK

    RAM(Resource Access Management)是阿里云提供的资源访问控制服务。RAM账号AK指的是通过RAM被授权的AK。这组AK只能按照RAM定义的规则去访问Bucket里的资源。通过RAM,您可以集中管理您的用户(比如员工、系统或应用程序),以及控制用户可以访问您名下哪些资源的权限。比如,能够限制您的用户只拥有对某一个Bucket的读权限。子账号是从属于主账号的,并且这些账号下不能拥有实际的任何资源,所有资源都属于主账号。

  • STS账号AK

    STS(Security Token Service)是阿里云提供的临时访问凭证服务。STS账号AK指的是通过STS颁发的AK。这组AK只能按照STS定义的规则去访问Bucket里的资源。

身份验证具体实现

目前主要有三种身份验证方式:

  • AK验证
  • RAM验证
  • STS验证

当用户以个人身份向OSS发送请求时,其身份验证的实现如下:

  1. 用户将发送的请求按照OSS指定的格式生成签名字符串。
  2. 用户使用AccessKeySecret对签名字符串进行加密产生验证码。
  3. OSS收到请求以后,通过AccessKeyId找到对应的AccessKeySecret,以同样的方法提取签名字符串和验证码。
    • 如果计算出来的验证码和提供的一样即认为该请求是有效的。
    • 否则,OSS将拒绝处理这次请求,并返回HTTP 403错误。

带身份验证访问OSS的三种方法