Todos los productos
Search
Centro de documentos

Object Storage Service:Authorize access (Android SDK)

Última actualización: Sep 25, 2026

El kit de desarrollo de software (SDK) para Android proporciona el modo de autenticación STS, el modo autofirmado y las URL prefirmadas para proteger los dispositivos móviles.

Contexto

Tanto en el modo de autenticación STS como en el modo autofirmado, la función de callback que usted implemente debe devolver el token y la firma cuando se invoque. Para enviar una solicitud de red a su servidor de aplicaciones y obtener el token y la firma, llame a la API síncrona de la biblioteca de red. Cuando el SDK inicia una solicitud, el callback se ejecuta en un hilo secundario, por lo que no bloquea el hilo principal.

Modo de autenticación STS

Nota

Para usar el modo STS en la autorización, primero debe activar Alibaba Cloud Resource Access Management (RAM).

Puede utilizar Alibaba Cloud Security Token Service (STS) para acceder temporalmente a OSS con autorización. STS es un servicio web que proporciona tokens de acceso temporales a los usuarios de cómputo en la nube. Con STS, emita una credencial de acceso con un tiempo de vida (TTL) y permisos personalizados a una aplicación de terceros o a un usuario federado cuya identidad usted gestiona. Para obtener más información, consulte What is STS?.

STS ofrece las siguientes ventajas:

  • No necesita exponer su par de AccessKey de largo plazo a una aplicación de terceros. En su lugar, genere un token de acceso con permisos personalizados y un periodo de validez específico para proporcionarlo a la aplicación.

  • No necesita gestionar la revocación de permisos, ya que el token de acceso deja de ser válido automáticamente al caducar.

Para conceder acceso temporal a OSS mediante STS, siga estos pasos:

  1. Obtenga las credenciales de acceso temporales.

    Las credenciales de acceso temporales incluyen un par de AccessKey temporal, compuesto por un AccessKey ID y un AccessKey secret, además de un token de seguridad. El periodo de validez de estas credenciales se mide en segundos. El valor mínimo es 900. El valor máximo corresponde a la duración máxima de sesión configurada para el rol de RAM actual. Para obtener más información, consulte Set the maximum session duration for a RAM role.

    Obtenga las credenciales de acceso temporales de una de las dos formas a continuación:

  2. Use las credenciales de acceso temporales para inicializar el SDK.

    String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    
    OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider("StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken");
    
    OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);                  

    Cuando inicialice el SDK con credenciales de acceso temporales, tenga en cuenta el periodo de validez del StsToken.

    El siguiente código muestra cómo actualizar el StsToken cuando su periodo de validez restante es inferior a 5 minutos:

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date date = sdf.parse("<StsToken.Expiration>");
    long expiration = date.getTime() / 1000;
    // If the StsToken is about to expire in less than 5 minutes, update the StsToken.
    if (DateUtil.getFixedSkewedTimeMillis() / 1000 > expiration - 5 * 60) {
        oss.updateCredentialProvider(new OSSStsTokenCredentialProvider("StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken"));
    }
    • Actualizar manualmente el StsToken

      Cuando el StsToken esté a punto de caducar, reconstruya el OSSClient o actualice el CredentialProvider de la siguiente manera:

      oss.updateCredentialProvider(new OSSStsTokenCredentialProvider("StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken"));                   
    • Actualizar automáticamente el StsToken

      Para que el SDK actualice automáticamente el StsToken, implemente un callback en su aplicación. El SDK invoca el callback que usted implementó para obtener un Federation Token (StsToken). Después, utiliza este token para firmar y vuelve a llamar al callback para obtener un nuevo StsToken cuando el actual está a punto de caducar.

      String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
      
      OSSCredentialProvider credentialProvider = new OSSFederationCredentialProvider() {
      
          @Override
          public OSSFederationToken getFederationToken() {
          // Obtain the FederationToken and construct it as an OSSFederationToken object to return. If the FederationToken fails to be obtained for any reason, the server directly returns null.
      
              OSSFederationToken token;
              // Obtain the token from your server.
              return token;
          }
      };
      
      OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);                    
      Nota

      Si ya obtuvo los campos obligatorios del StsToken por otros medios, también puede devolver el StsToken directamente en el callback. Sin embargo, debe gestionar manualmente la actualización del StsToken y restablecer el OSSCredentialProvider de la instancia de OSSClient después de dicha actualización.

      Por ejemplo, si accede al servidor en http://localhost:8080/distribute-token.json, se devuelven los siguientes datos:

      {
          "StatusCode": 200,
          "AccessKeyId":"STS.iA645eTOXEqP3cg3****",
          "AccessKeySecret":"rV3VQrpFQ4BsyHSAvi5NVLpPIVffDJv4LojU****",
          "Expiration":"2015-11-03T09:52:59Z",
          "SecurityToken":"CAES7QIIARKAAZPlqaN9ILiQZPS+JDkS/GSZN45RLx4YS/p3OgaUC+oJl3XSlbJ7StKpQ****"}                    

      El siguiente ejemplo muestra cómo implementar OSSFederationCredentialProvider:

      OSSCredentialProvider credetialProvider = new OSSFederationCredentialProvider() {
          @Override
          public OSSFederationToken getFederationToken() {
              try {
                  URL stsUrl = new URL("http://localhost:8080/distribute-token.json");
                  HttpURLConnection conn = (HttpURLConnection) stsUrl.openConnection();
                  InputStream input = conn.getInputStream();
                  String jsonText = IOUtils.readStreamAsString(input, OSSConstants.DEFAULT_CHARSET_NAME);
                  JSONObject jsonObjs = new JSONObject(jsonText);
                  String ak = jsonObjs.getString("AccessKeyId");
                  String sk = jsonObjs.getString("AccessKeySecret");
                  String token = jsonObjs.getString("SecurityToken");
                  String expiration = jsonObjs.getString("Expiration");
                  return new OSSFederationToken(ak, sk, token, expiration);
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return null;
          }
      };                    

URL prefirma

Notas

  • Cuando usa un SDK de OSS para generar una URL prefirma, el SDK calcula una firma mediante un algoritmo específico basado en la información de clave almacenada en la computadora local. Luego, añade esta firma a una URL para garantizar su validez y seguridad. Las operaciones para calcular y construir la URL se completan en el cliente, por lo que no necesita enviar solicitudes al servidor a través de la red. De este modo, tampoco necesita otorgar permisos específicos a quien realiza la llamada al generar la URL prefirma. No obstante, para que los usuarios de terceros puedan realizar operaciones en los recursos autorizados por la URL prefirma, asegúrese de que la entidad de seguridad que llama a las API para generarla cuente con los permisos correspondientes.

    Por ejemplo, si una entidad de seguridad desea cargar un objeto mediante una URL prefirma, debe otorgarle el permiso oss:PutObject. Si desea descargar o previsualizar un objeto con una URL prefirma, debe otorgarle el permiso oss:GetObject.

  • La URL prefirma generada con el siguiente código de ejemplo podría contener un signo más (+). En ese caso, reemplace el signo más (+) de la URL por %2B. De lo contrario, es posible que la URL prefirma no permita acceder al objeto como se espera.

Los siguientes ejemplos muestran cómo usar URL prefirmadas para la autorización temporal.

Generar una URL prefirma y usarla para cargar un archivo

  1. Genere una URL prefirma para la carga.

    // Specify the bucket name, for example, examplebucket.
    String bucketName = "examplebucket";
    // Specify the full path of the source object, without the bucket name, for example, exampleobject.txt.
    String objectKey = "exampleobject.txt";
    // Set the content-type.
    String contentType = "application/octet-stream";
    String url = null;
    try {
        // Generate a presigned URL for uploading the file.
        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
        // Set the expiration time of the presigned URL to 30 minutes.
        request.setExpiration(30*60);
        request.setContentType(contentType);    
        request.setMethod(HttpMethod.PUT);
        url = oss.presignConstrainedObjectURL(request);
        Log.d("url", url);
    } catch (ClientException e) {
        e.printStackTrace();
    }
  2. Cargue un archivo mediante la URL prefirma.

    // Specify the generated presigned URL.
    String url = "";
    // Specify the full path of the local file.
    String localFile = "/storage/emulated/0/oss/examplefile";
    // Set the content-type.
    String contentType = "application/octet-stream";
    // Upload the file using the presigned URL.
    OkHttpClient client = new OkHttpClient();
    Request putRequest = new Request.Builder()
            .url(url)
            .put(RequestBody.create(MediaType.parse(contentType), new File(localFile)))
            .build();
    client.newCall(putRequest).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }
    
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            Log.d("response", response.body().string());
        }
    });

Generar una URL prefirma y usarla para descargar un archivo

  1. Genere una URL prefirma para la descarga.

    // Specify the bucket name, for example, examplebucket.
    String bucketName = "examplebucket";
    // Specify the full path of the source object, without the bucket name, for example, exampleobject.txt.
    String objectKey = "exampleobject.txt";
    String url = null;
    try {
        // Generate a presigned URL for downloading the file.
        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
        // Set the expiration time of the presigned URL to 30 minutes.
        request.setExpiration(30*60);
        request.setMethod(HttpMethod.GET);
        url = oss.presignConstrainedObjectURL(request);
        Log.d("url", url);
    } catch (ClientException e) {
        e.printStackTrace();
    }
  2. Descargue un archivo mediante la URL prefirma.

    // Specify the generated presigned URL.
    String url = "";
    OkHttpClient client = new OkHttpClient();
    // Download the file using the presigned URL.
    Request getRequest = new Request.Builder()
            .url(url)
            .get()
            .build();
    client.newCall(getRequest).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }
    
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.code() == 203 || response.code() >= 300) {
                Log.d("download", "fail");
                Log.d("download", response.body().string());
                return;
            }
            // The request was successful.
            InputStream inputStream = response.body().byteStream();
    
            byte[] buffer = new byte[2048];
            int len;
    
            while ((len = inputStream.read(buffer)) != -1) {
                // Process the downloaded data, such as displaying an image or writing to a file.
            }
        }
    });