edit-icon download-icon

認証されたアクセス

最終更新日: Oct 26, 2017

STSの一時認証機能を使う

紹介

OSSは、Alibaba Cloud STSサービスを使用してアクセスの許可を一時的に付与することができます。 Alibaba Cloud STS(Security Token Service)は、クラウドコンピューティングユーザーに一時的なアクセストークンを提供するWebサービスです。STSを使用すると、カスタム有効期間とアクセス権を持つアクセス資格情報をサードパーティのアプリケーションまたはフェデレーションユーザー(ユーザーIDを管理できます)に割り当てることができます。サードパーティのアプリケーションまたはフェデレーションユーザーは、これらのアクセス資格情報を使用してAlibaba Cloud製品APIを直接呼び出したり、Alibaba Cloud製品が提供するSDKを使用してクラウド製品APIにアクセスすることができます。

  • 長期キー(AccessKey)をサードパーティアプリケーションに公開する必要はありません。アクセストークンを生成して、アクセストークンをサードパーティのアプリケーションに送信する必要があります。このトークンのアクセス許可と妥当性をカスタマイズできます。
  • 権限廃止に関する問題も心配要りません。失効時期が到来すると自動的にアクセストークンは無効になります。

interaction process

ソリューションの説明は次のとおりです。

  1. アプリユーザとしてログインします。アプリユーザのIDは顧客が管理しており、顧客はID管理システムをカスタマイズしたりまたは外部のウェブアカウントかopenIDを使用することができます。正当なアプリユーザに対して、アプリサーバは的確に最小限度のアクセス権限を定義します。

  2. AppServerは、セキュリティトークン(SecurityToken)をSTSに要求します。

    1. STSを呼び出す前に、AppServerは、アプリユーザーの最小アクセス許可(ポリシー構文で説明)と承認の有効期限を判断する必要があります。

    2. STSのAssumeRoleインターフェイスを呼び出して、セキュリティトークンを取得します。役割と使用方法の詳細については、RAMユーザーガイドの「ロールの管理」を参照してください。

  3. アクセス信任状には、セキュリティトークン、AcessKeysの一時的なペア(AccessKeyIdとAccessKeySecret)、および有効期限が含まれています。

  4. アプリサーバはアクセス資格証明書をClientAppに返します。 ClientAppはこの資格証明書をキャッシュすることができます。資格証明書が無効になったときClientAppはアプリサーバから新たに有効なアクセス資格証明書を要求する必要があります。 たとえばアクセス資格証明書が1時間有効であるならばClientAppは30分ごとにアクセス資格証明書の更新をアプリサーバに対して要求することができます。

  5. ClientAppはローカルにキャッシュされたアクセス資格証明書をAlibaba Cloud APIを要求するために使用します。クラウドサービス側ではSTSアクセス資格情報を認識しており、資格情報の正当性の確認をSTSに任せることでユーザにリクエストを正しく返します。

STSセキュリティトークンについての詳細は 「ロールの管理」を参照してください。 重要なことはSTSインターフェイス「ロールの引き受け」を呼び出すことによって正当なアクセス資格証明書を取得することです。STS Java SDKでメソッドの呼び出し方法は「STS Java SDKについて」を参照してください。

署名リクエストを構築するためにSTS資格証明書を使用

STSの一時資格証明書を入手後、ユーザのクライアントはセキュリティトークン(SecurityToken)や一時アクセスキー (AccessKeyId, AccessKeySecret)を使ってOSSClientを生成します。例としてオブジェクトのアップロードを挙げておきます。

  1. String accessKeyId = "<accessKeyId>";
  2. String accessKeySecret = "<accessKeySecret>";
  3. String securityToken = "<securityToken>"
  4. // Take Hangzhou as an example
  5. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  6. OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);

認証アクセスのために署名付きURLを使用

署名付きURLの生成

署名付きURLを生成することによってユーザに一時的なアクセスURLを提供できます。URL生成過程でユーザのアクセス期間を制限するためのURL満了日時を指定できます。

署名付きURLの生成

コードは次のようになります。

  1. String bucketName = "your-bucket-name";
  2. String key = "your-object-key";
  3. // Set the URL expiration time to one hour
  4. Date expiration = new Date(new Date().getTime() + 3600 * 1000);
  5. // Generate the URL
  6. URL url = client.generatePresignedUrl(bucketName, key, expiration);

デフォルトでは生成されたURLはGET accessをサポートしており、ユーザはブラウザを通して関連コンテンツに直接アクセスできる許可を与えられます。

別のHTTPメソッドによるURLの生成

一時的にユーザに他の操作(たとえばオブジェクトのアップロードや削除など)の実行権を付与するには、別の方法によりURLに署名する必要があります。以下例:

  1. // Generate a URL of the PUT method
  2. URL url = client.generatePresignedUrl(bucketName, key, expiration, HttpMethod.PUT);

HttpMethod.PUTにパラメータを渡し、生成されたURLを使用することでオブジェクトのアップロードが可能になります。

ユーザ定義のパラメータを追加(ユーザメタデータ)

オブジェクトをアップロードするために署名付きURLを生成し、ユーザメタデータ、コンテンツタイプ、別のヘッダーを指定する場合、手順は以下のようになります。

  1. // Create a request
  2. GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key);
  3. // Set HttpMethod to PUT
  4. generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
  5. // Add UserMetadata
  6. generatePresignedUrlRequest.addUserMetadata("author", "baymax");
  7. // Add Content-Type
  8. request.setContentType("application/octet-stream");
  9. // Generate the signed URL
  10. URL url = client.generatePresignedUrl(generatePresignedUrlRequest);

注意: 上記の処理では、署名付きURLのみが生成されます。依然としてリクエストヘッダにメタ情報を追加する必要があります。 次のコードを見ることができます。

リクエストを送信するために署名付きURLを使用

現在、Java SDKはput-objectget-objectURL-signature-requestsをサポートしています。

オブジェクトを取得するために署名付きURLを使用

  1. //The server generates the signed URL string
  2. OSSClient Server = new OSSClient(endpoint, accessId, accessKey);
  3. Date expiration = DateUtil.parseRfc822Date("Wed, 18 Mar 2015 14:20:00 GMT");
  4. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.GET);
  5. //Set the expiration time
  6. request.setExpiration(expiration);
  7. // Generate the URL signature (HTTP GET request)
  8. URL signedUrl = Server .generatePresignedUrl(request);
  9. System.out.println("signed url for getObject: " + signedUrl);
  10. //The client uses the signed URL string to send the request
  11. OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  12. Map<String, String> customHeaders = new HashMap<String, String>();
  13. // Add the GetObject request header
  14. customHeaders.put("Range", "bytes=100-1000");
  15. OSSObject object = client.getObject(signedUrl,customHeaders);

オブジェクトを配置するために署名付きURLを使用

  1. //The server generates the signed URL string
  2. OSSClient Server = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  3. Date expiration = DateUtil.parseRfc822Date("Wed, 18 Mar 2015 14:20:00 GMT");
  4. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.PUT);
  5. //Set the expiration time
  6. request.setExpiration(expiration);
  7. //Set Content-Type
  8. request.setContentType("application/octet-stream");
  9. // Add user meta
  10. request.addUserMetadata("author", "aliy");
  11. // Generate the signed URL (HTTP PUT request)
  12. URL signedUrl = Server.generatePresignedUrl(request);
  13. System.out.println("signed url for putObject: " + signedUrl);
  14. //The client uses the signed URL string to send the request
  15. OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  16. File f = new File(filePath);
  17. FileInputStream fin = new FileInputStream(f);
  18. // Add the PutObject request header
  19. Map<String, String> customHeaders = new HashMap<String, String>();
  20. customHeaders.put("Content-Type", "application/octet-stream");
  21. // Add user meta
  22. customHeaders.put("x-oss-meta-author", "aliy");
  23. PutObjectResult result = client.putObject(signedUrl, fin, f.length(), customHeaders);