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
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:
-
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:
-
Método 1
Llame a la operación AssumeRole para obtener las credenciales de acceso temporales.
-
Método 2
Utilice STS SDKs for different languages para obtener las credenciales de acceso temporales.
-
-
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);NotaSi 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.