

# 使用 Amazon Web Services 账户 或 IAM 用户凭证发出请求
<a name="AuthUsingAcctOrUserCredentials"></a>

您可以使用 Amazon Web Services 账户 或 IAM 用户安全凭证向 Amazon S3 发送经身份验证的请求。本部分提供的示例演示了如何使用 Amazon SDK for Java、Amazon SDK for .NET 和 适用于 PHP 的 Amazon SDK 发送经身份验证的请求。有关 Amazon 可用开发工具包的列表，请转到 [示例代码和库](https://www.amazonaws.cn/code/)。

每个 Amazon 开发工具包都使用开发工具包特有的凭证提供程序链来查找和使用凭证，并代表凭证拥有者执行操作。所有这些凭证提供程序链的共同点是，它们都会寻找您的本地 Amazon 凭证文件。

有关更多信息，请参阅以下主题：

**Topics**
+ [创建本地 Amazon 凭证文件](#create-local-aws-credentials-file)
+ [使用 Amazon 开发工具包发送经身份验证的请求](#send-authenticated-request-SDKs)
+ [相关资源](#RelatedResources002)

## 创建本地 Amazon 凭证文件
<a name="create-local-aws-credentials-file"></a>

为 Amazon 开发工具包配置凭证的最简单方法是使用 Amazon 凭证文件。如果您使用 Amazon Command Line Interface (Amazon CLI)，那么您可能已经配置了本地 Amazon 凭证文件。否则，请按照以下步骤设置凭证文件：

1. 登录 Amazon Web Services 管理控制台，单击 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。

1. 创建一个新用户，其权限仅限于您希望您的代码有权访问的服务和操作。有关创建新用户的更多信息，请参阅[创建 IAM 用户（控制台）](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)，并按照直至步骤 8 的说明进行操作。

1. 选择 **Download .csv**（下载 .csv）以保存 Amazon 凭证的本地副本。

1. 在您的计算机上，导航至主目录，并创建 `.aws` 目录。在基于 Unix 的系统 (例如 Linux 或 OS X) 上，它在以下位置：

   ```
   ~/.aws
   ```

   在 Windows 上，它在以下位置：

   ```
   %HOMEPATH%\.aws
   ```

1. 在 `.aws` 目录中，创建名为 `credentials` 的新文件。

1. 打开您从 IAM 控制台中下载的凭证 `.csv` 文件，并使用以下格式将其内容复制到 `credentials` 文件：

   ```
   [default]
   aws_access_key_id = your_access_key_id
   aws_secret_access_key = your_secret_access_key
   ```

1. 保存 `credentials` 文件，并删除在步骤 3 中下载的 `.csv` 文件。

您的共享凭证文件现在已在本地计算机上配置完毕，可以与 Amazon 开发工具包一起使用。

## 使用 Amazon 开发工具包发送经身份验证的请求
<a name="send-authenticated-request-SDKs"></a>

使用 Amazon 开发工具包发送经过身份验证的请求。有关发送经过身份验证的请求的更多信息，请参阅 [Amazon 安全证书](https://docs.amazonaws.cn/IAM/latest/UserGuide/security-creds.html)或 [IAM Identity Center 身份验证](https://docs.amazonaws.cn//sdkref/latest/guide/access-sso.html)。

------
#### [ Java ]

有关使用适用于 Java 的 Amazon SDK 对请求进行身份验证的信息，请参阅《Amazon SDK 和工具参考指南》中的[使用共享配置和凭证文件全局配置 Amazon SDK 和工具](https://docs.amazonaws.cn/sdkref/latest/guide/file-format.html)以及[使用 Amazon SDK 和工具进行身份验证和访问](https://docs.amazonaws.cn/sdkref/latest/guide/access.html)。

------
#### [ .NET ]

使用 Amazon Web Services 账户 或 IAM 用户凭证发送经身份验证的请求：
+ 创建 `AmazonS3Client` 类的实例。
+ 运行 `AmazonS3Client` 方法之一，以向 Amazon S3 发送请求。客户端将通过您提供的凭证生成所需的签名并将其包含在它发送到 Amazon S3 的请求中。

有关更多信息，请参阅[使用 Amazon 账户或 IAM 用户凭证发出请求](https://docs.amazonaws.cn/AmazonS3/latest/userguide/AuthUsingAcctOrUserCredentials.html)。

**注意**  
您可以在不提供安全凭证的情况下创建 `AmazonS3Client` 客户端。使用此客户端发送的请求是匿名的请求，它们不带签名。如果为不是公开可用的资源发送了匿名请求，Amazon S3 将返回错误。
您可以创建 Amazon Web Services 账户 并创建所需的用户。您还可以管理这些用户的凭证。您需要这些凭证才能执行以下示例中的任务。有关更多信息，请参阅《Amazon SDK for .NET 开发人员指南》**中的[配置 Amazon 凭证](https://docs.amazonaws.cn/sdk-for-net/latest/developer-guide/net-dg-config-creds.html)。  
然后，您还可以将应用程序配置为主动检索配置文件和凭证，然后在创建 Amazon 服务客户端时明确使用这些凭证。有关更多信息，请参阅《*Amazon SDK for .NET 开发人员指南*》中的 [访问应用程序中的凭证和配置文件](https://docs.amazonaws.cn/sdk-for-net/latest/developer-guide/creds-locate.html)。

以下 C\# 示例说明如何执行上述任务。有关设置和运行代码示例的信息，请参阅《适用于 .NET 的 Amazon SDK 开发人员指南》**中的[适用于 .NET 的 Amazon SDK 入门](https://docs.amazonaws.cn/sdk-for-net/latest/developer-guide/net-dg-setup.html)。

**Example**  

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class MakeS3RequestTest
    {
        private const string bucketName = "*** bucket name ***"; 
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 client;

        public static void Main()
        {
            using (client = new AmazonS3Client(bucketRegion))
            {
                Console.WriteLine("Listing objects stored in a bucket");
                ListingObjectsAsync().Wait();
            }
        }

        static async Task ListingObjectsAsync()
        {
            try
            {
                ListObjectsRequest request = new ListObjectsRequest
                {
                    BucketName = bucketName,
                    MaxKeys = 2
                };
                do
                {
                    ListObjectsResponse response = await client.ListObjectsAsync(request);
                    // Process the response.
                    foreach (S3Object entry in response.S3Objects)
                    {
                        Console.WriteLine("key = {0} size = {1}",
                            entry.Key, entry.Size);
                    }

                    // If the response is truncated, set the marker to get the next 
                    // set of keys.
                    if (response.IsTruncated)
                    {
                        request.Marker = response.NextMarker;
                    }
                    else
                    {
                        request = null;
                    }
                } while (request != null);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

------
#### [ PHP ]

此部分说明如何使用版本 3 的 适用于 PHP 的 Amazon SDK 中的类来通过 Amazon Web Services 账户 或 IAM 用户凭证发送经身份验证的请求。有关适用于 Ruby 的 Amazon 开发工具包 API 的更多信息，请转到[适用于 Ruby 的 Amazon 开发工具包 – 版本 2](https://docs.amazonaws.cn/sdkforruby/api/index.html)。

以下 PHP 示例说明客户端如何使用您的安全凭证发出请求以列出您的账户的所有存储桶。

**Example**  

```
 
require 'vendor/autoload.php';

use Aws\S3\Exception\S3Exception;
use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';

$s3 = new S3Client([
    'region' => 'us-east-1',
    'version' => 'latest',
]);

// Retrieve the list of buckets.
$result = $s3->listBuckets();

try {
    // Retrieve a paginator for listing objects.
    $objects = $s3->getPaginator('ListObjects', [
        'Bucket' => $bucket
    ]);

    echo "Keys retrieved!" . PHP_EOL;

    // Print the list of objects to the page.
    foreach ($objects as $object) {
        echo $object['Key'] . PHP_EOL;
    }
} catch (S3Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}
```

**注意**  
您可以在不提供安全凭证的情况下创建 `S3Client` 客户端。使用此客户端发送的请求是匿名的请求，它们不带签名。如果为不是公开可用的资源发送了匿名请求，Amazon S3 将返回错误。有关更多信息，请参阅 [适用于 PHP 的 Amazon SDK 文档](https://www.amazonaws.cn/documentation/sdk-for-php/) 中的 [创建匿名客户端](https://docs.amazonaws.cn/sdk-for-php/v3/developer-guide/guide_credentials_anonymous.html)。

------
#### [ Ruby ]

使用 适用于 Ruby 的 Amazon SDK 的版本 3 调用 Amazon S3 之前，必须设置 Amazon 访问凭证以便开发工具包用来验证您对存储桶和对象的访问权限。如果您在本地系统上的 Amazon 凭证配置文件中设置了共享凭证，则适用于 Ruby 的开发工具包的版本 3 可以在无需您在代码中声明这些凭证的情况下使用它们。有关设置共享凭证的更多信息，请参阅[使用 Amazon 账户或 IAM 用户凭证发出请求](https://docs.amazonaws.cn/AmazonS3/latest/userguide/AuthUsingAcctOrUserCredentials.html)。

以下 Ruby 代码段使用本地计算机上凭证文件中的共享 Amazon 凭证，对要获取特定存储桶中的所有对象键名的请求进行身份验证。它将执行以下操作：

1. 创建 `Aws::S3::Client` 类的实例。

1. 使用 `list_objects_v2` 的 `Aws::S3::Client` 方法，通过枚举存储桶中的对象向 Amazon S3 发出请求。客户端将根据计算机上 Amazon 凭证文件中的凭证生成所需的签名值，并将其包含在发送给 Amazon S3 的请求中。

1. 将对象键名阵列打印到终端。

**Example**  

```
# Prerequisites:
#  - An existing Amazon S3 bucket.

require 'aws-sdk-s3'

# @param s3_client [Aws::S3::Client] An initialized Amazon S3 client.
# @param bucket_name [String] The bucket's name.
# @return [Boolean] true if all operations succeed; otherwise, false.
# @example
#   s3_client = Aws::S3::Client.new(region: 'us-west-2')
#   exit 1 unless list_bucket_objects?(s3_client, 'amzn-s3-demo-bucket')
def list_bucket_objects?(s3_client, bucket_name)
  puts "Accessing the bucket named '#{bucket_name}'..."
  objects = s3_client.list_objects_v2(
    bucket: bucket_name,
    max_keys: 50
  )

  if objects.count.positive?
    puts 'The object keys in this bucket are (first 50 objects):'
    objects.contents.each do |object|
      puts object.key
    end
  else
    puts 'No objects found in this bucket.'
  end

  true
rescue StandardError => e
  puts "Error while accessing the bucket named '#{bucket_name}': #{e.message}"
  false
end

# Example usage:
def run_me
  region = 'us-west-2'
  bucket_name = 'BUCKET_NAME'
  s3_client = Aws::S3::Client.new(region: region)

  exit 1 unless list_bucket_objects?(s3_client, bucket_name)
end

run_me if $PROGRAM_NAME == __FILE__
```

即使没有本地 Amazon 凭证文件，您仍可以创建 `Aws::S3::Client` 资源并针对 Amazon S3 存储桶和对象运行代码。使用适用于 Ruby 的开发工具包的版本 3 发送的请求是匿名的，默认情况下没有签名。如果为不是公开可用的资源发送了匿名请求，Amazon S3 将返回错误。

可以针对适用于 Ruby 的开发工具包应用程序使用并扩展前一个代码段，如下面的更可靠的示例所示。

```
# Prerequisites:
#  - An existing Amazon S3 bucket.

require 'aws-sdk-s3'

# @param s3_client [Aws::S3::Client] An initialized Amazon S3 client.
# @param bucket_name [String] The bucket's name.
# @return [Boolean] true if all operations succeed; otherwise, false.
# @example
#   s3_client = Aws::S3::Client.new(region: 'us-west-2')
#   exit 1 unless list_bucket_objects?(s3_client, 'amzn-s3-demo-bucket')
def list_bucket_objects?(s3_client, bucket_name)
  puts "Accessing the bucket named '#{bucket_name}'..."
  objects = s3_client.list_objects_v2(
    bucket: bucket_name,
    max_keys: 50
  )

  if objects.count.positive?
    puts 'The object keys in this bucket are (first 50 objects):'
    objects.contents.each do |object|
      puts object.key
    end
  else
    puts 'No objects found in this bucket.'
  end

  true
rescue StandardError => e
  puts "Error while accessing the bucket named '#{bucket_name}': #{e.message}"
  false
end

# Example usage:
def run_me
  region = 'us-west-2'
  bucket_name = 'BUCKET_NAME'
  s3_client = Aws::S3::Client.new(region: region)

  exit 1 unless list_bucket_objects?(s3_client, bucket_name)
end

run_me if $PROGRAM_NAME == __FILE__
```

------
#### [ Go ]

**Example**  
以下示例使用由 SDK for Go 从共享凭证文件中自动加载的 Amazon 凭证。  

```
package main

import (
	"context"
	"errors"
	"fmt"

	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"github.com/aws/smithy-go"
)

// main uses the AWS SDK for Go V2 to create an Amazon Simple Storage Service
// (Amazon S3) client and list up to 10 buckets in your account.
// This example uses the default settings specified in your shared credentials
// and config files.
func main() {
	ctx := context.Background()
	sdkConfig, err := config.LoadDefaultConfig(ctx)
	if err != nil {
		fmt.Println("Couldn't load default configuration. Have you set up your AWS account?")
		fmt.Println(err)
		return
	}
	s3Client := s3.NewFromConfig(sdkConfig)
	count := 10
	fmt.Printf("Let's list up to %v buckets for your account.\n", count)
	result, err := s3Client.ListBuckets(ctx, &s3.ListBucketsInput{})
	if err != nil {
		var ae smithy.APIError
		if errors.As(err, &ae) && ae.ErrorCode() == "AccessDenied" {
			fmt.Println("You don't have permission to list buckets for this account.")
		} else {
			fmt.Printf("Couldn't list buckets for your account. Here's why: %v\n", err)
		}
		return
	}
	if len(result.Buckets) == 0 {
		fmt.Println("You don't have any buckets!")
	} else {
		if count > len(result.Buckets) {
			count = len(result.Buckets)
		}
		for _, bucket := range result.Buckets[:count] {
			fmt.Printf("\t%v\n", *bucket.Name)
		}
	}
}
```

------

## 相关资源
<a name="RelatedResources002"></a>
+ [使用 Amazon SDK 通过 Amazon S3 进行开发](sdk-general-information-section.md)
+ [适用于 PHP 的 Amazon SDK面向 Amazon S3 Aws\\S3\\S3Client 类的](https://docs.amazonaws.cn/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html) 
+ [适用于 PHP 的 Amazon SDK 文档](https://www.amazonaws.cn/documentation/sdk-for-php/)