Le kit de développement logiciel (SDK) Android propose le mode d'authentification STS, le mode autosigné et les URL pré-signées pour sécuriser les appareils mobiles.
Informations contextuelles
Pour les modes d'authentification STS et autosigné, la fonction de rappel que vous implémentez doit renvoyer le jeton et la signature lorsqu'elle est appelée. Pour envoyer une requête réseau à votre serveur d'application afin d'obtenir le jeton et la signature, appelez l'API synchrone de la bibliothèque réseau. Le rappel s'exécute dans un sous-thread lorsque le SDK initie une requête et ne bloque donc pas le thread principal.
Mode d'authentification STS
Pour utiliser le mode STS pour l'autorisation, activez d'abord Alibaba Cloud Resource Access Management (RAM).
Vous pouvez utiliser Alibaba Cloud Security Token Service (STS) pour un accès temporaire autorisé à OSS. STS est un service web qui fournit des jetons d'accès temporaires aux utilisateurs du cloud computing. En utilisant STS, vous pouvez émettre des identifiants d'accès avec une durée de vie (TTL) personnalisée et des autorisations personnalisées à une application tierce ou à un utilisateur fédéré dont vous gérez l'identité. Pour plus d'informations, consultez Qu'est-ce que STS ?.
STS offre les avantages suivants :
Vous n'avez pas besoin d'exposer votre paire AccessKey à long terme à une application tierce. Vous pouvez plutôt générer un jeton d'accès avec des autorisations d'accès personnalisées et une période de validité spécifique à fournir à l'application.
Vous n'avez pas besoin de gérer la révocation des autorisations, car le jeton d'accès devient automatiquement invalide à son expiration.
Pour utiliser STS afin d'accorder un accès temporaire à OSS, suivez ces étapes :
-
Obtenez des identifiants d'accès temporaires.
Les identifiants d'accès temporaires incluent une paire AccessKey temporaire, composée d'un AccessKey ID et d'un AccessKey Secret, ainsi qu'un jeton de sécurité. La période de validité des identifiants d'accès temporaires est mesurée en secondes. La valeur minimale est de 900. La valeur maximale correspond à la durée de session maximale définie pour le rôle RAM actuel. Pour plus d'informations, consultez Définir la durée de session maximale pour un rôle RAM.
Vous pouvez obtenir des identifiants d'accès temporaires de l'une des deux manières suivantes :
-
Méthode 1
Appelez l'opération AssumeRole pour obtenir des identifiants d'accès temporaires.
-
Méthode 2
Utilisez les SDK STS pour différents langages pour obtenir des identifiants d'accès temporaires.
-
-
Utilisez les identifiants d'accès temporaires pour initialiser le 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);Lorsque vous initialisez le SDK avec des identifiants d'accès temporaires, tenez compte de la période de validité du StsToken.
Le code suivant montre comment mettre à jour le StsToken lorsque sa période de validité restante est inférieure à 5 minutes :
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")); }-
Mettre à jour manuellement le StsToken
Lorsque le StsToken est sur le point d'expirer, reconstruisez l'OSSClient ou mettez à jour le CredentialProvider comme suit :
oss.updateCredentialProvider(new OSSStsTokenCredentialProvider("StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken")); -
Mettre à jour automatiquement le StsToken
Pour permettre au SDK de mettre à jour automatiquement le StsToken, implémentez un rappel dans votre application. Le SDK appelle le rappel que vous avez implémenté pour obtenir un Federation Token (StsToken). Le SDK utilise ensuite ce jeton pour la signature et appelle le rappel pour obtenir un nouveau StsToken lorsque le jeton actuel est sur le point d'expirer.
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);RemarqueSi vous avez déjà obtenu les champs requis pour le StsToken par d'autres moyens, vous pouvez également renvoyer directement le StsToken dans le rappel. Toutefois, vous devez gérer manuellement la mise à jour du StsToken et réinitialiser l'OSSCredentialProvider pour l'instance OSSClient après la mise à jour.
Par exemple, si vous accédez au serveur à l'adresse http://localhost:8080/distribute-token.json, les données suivantes sont renvoyées :
{ "StatusCode": 200, "AccessKeyId":"STS.iA645eTOXEqP3cg3****", "AccessKeySecret":"rV3VQrpFQ4BsyHSAvi5NVLpPIVffDJv4LojU****", "Expiration":"2015-11-03T09:52:59Z", "SecurityToken":"CAES7QIIARKAAZPlqaN9ILiQZPS+JDkS/GSZN45RLx4YS/p3OgaUC+oJl3XSlbJ7StKpQ****"}L'exemple suivant montre comment implémenter 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 pré-signée
Remarques
-
Lorsque vous utilisez un SDK OSS pour générer une URL pré-signée, le SDK OSS utilise un algorithme spécifique basé sur les informations clés stockées sur l'ordinateur local pour calculer une signature et ajoute cette signature à une URL afin de garantir la validité et la sécurité de l'URL. Les opérations effectuées pour calculer et construire l'URL sont réalisées sur le client. Vous n'avez pas besoin d'envoyer de requêtes au serveur via le réseau. De cette manière, vous n'avez pas besoin d'accorder des autorisations spécifiques à l'appelant lors de la génération de l'URL pré-signée. Toutefois, pour permettre aux utilisateurs tiers d'effectuer les opérations pertinentes sur les ressources autorisées par l'URL pré-signée, assurez-vous que le principal qui appelle les opérations API pour générer l'URL pré-signée dispose des autorisations correspondantes.
Par exemple, si un principal souhaite télécharger un objet à l'aide d'une URL pré-signée, accordez-lui l'autorisation oss:PutObject. Si un principal souhaite télécharger ou afficher un objet à l'aide d'une URL pré-signée, accordez-lui l'autorisation oss:GetObject.
L'URL pré-signée générée à l'aide de l'exemple de code suivant peut contenir un signe plus (
+). Dans ce cas, remplacez le signe plus (+) dans l'URL par%2B. Sinon, l'URL pré-signée risque de ne pas permettre d'accéder à l'objet comme prévu.
Les exemples suivants montrent comment utiliser les URL pré-signées pour une autorisation temporaire.