Tous les produits
Search
Centre de documentation

Resource Access Management:Accéder à Alibaba Cloud depuis une application mobile à l'aide d'un jeton STS

Dernière mise à jour :Aug 09, 2026

Une application mobile peut utiliser un jeton STS associé à un rôle RAM pour accéder de manière sécurisée aux ressources Alibaba Cloud, sans intégrer d'identifiants à long terme.

Informations générales

Une entreprise développe une application mobile qui utilise Object Storage Service (OSS). L'application doit se connecter directement à OSS pour téléverser ou télécharger des données, mais elle s'exécute sur les appareils mobiles des utilisateurs finaux, que l'entreprise ne contrôle pas.

L'entreprise répond aux exigences suivantes :

  • Transfert direct des données : l'entreprise souhaite que l'application se connecte directement à OSS pour les téléversements et les téléchargements, plutôt que de faire transiter les données par le serveur d'applications backend.

  • Gestion sécurisée des identifiants : l'entreprise doit éviter d'intégrer des identifiants à long terme, tels qu'un AccessKey, dans l'application mobile. Les appareils des utilisateurs finaux constituent des environnements d'exécution non fiables.

  • Maîtrise des risques : conformément au principe du moindre privilège, chaque application doit disposer d'autorisations minimales et d'une session de courte durée lors de la connexion à OSS.

Solution

Lorsque l'application mobile doit téléverser ou télécharger des données depuis OSS, elle demande des identifiants au serveur d'applications. Ce dernier, en tant qu'utilisateur RAM, assume un rôle RAM en appelant l'opération STS AssumeRole et transmet le jeton STS renvoyé à l'application, qui l'utilise ensuite pour accéder à OSS.

移动设备应用访问阿里云

  1. L'application demande des identifiants au serveur d'applications.

  2. Créez un rôle RAM et accordez-lui les autorisations requises.

    Pour plus d'informations, consultez la rubrique Créer un rôle RAM et accorder des autorisations .

  3. Créez un utilisateur RAM pour le serveur d'applications et autorisez cet utilisateur à assumer le rôle RAM.

    Pour plus d'informations, consultez la rubrique Créer un utilisateur RAM et autoriser l'utilisateur à assumer un rôle RAM .

  4. Le serveur d'applications appelle l'opération STS AssumeRole pour obtenir un jeton STS pour le rôle RAM.

    Pour plus d'informations, consultez la rubrique Obtenir un jeton STS sur le serveur d'applications .

  5. Le serveur d'applications peut restreindre davantage les autorisations du jeton STS afin d'offrir un contrôle plus granulaire pour chaque client d'application.

    Pour plus d'informations, consultez la rubrique Limiter les autorisations d'un jeton STS .

  6. Lorsque l'application doit téléverser ou télécharger directement des données, elle utilise le jeton STS pour accéder à OSS.

    Pour plus d'informations, consultez la rubrique Utiliser un jeton STS pour accéder à OSS depuis l'application .

Créer un rôle RAM et accorder des autorisations

Supposons que l'ID de votre compte Alibaba Cloud soit 123456789012****.

  1. Utilisez votre compte Alibaba Cloud pour créer un rôle RAM nommé oss-objectmanager et sélectionnez Cloud Account comme type de principal.

    Remarque

    Lors de la création du rôle RAM, sélectionnez Current Account comme principal de confiance. Seuls les utilisateurs RAM appartenant au même compte Alibaba Cloud pourront ainsi assumer ce rôle RAM.

    Pour plus d'informations, consultez la rubrique Créer un rôle RAM pour un compte Alibaba Cloud.

    Une fois le rôle RAM créé, vous pouvez consulter son ARN et sa stratégie de confiance sur la page des détails du rôle.

    • L'ARN du rôle RAM est acs:ram::123456789012****:role/oss-objectmanager.

    • La stratégie de confiance du rôle RAM est la suivante.

      Remarque

      La stratégie de confiance ci-dessous autorise tout principal authentifié au sein du compte Alibaba Cloud 123456789012**** à assumer le rôle.

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "RAM": [
                "acs:ram::123456789012****:root"
              ]
            }
          }
        ],
        "Version": "1"
      }
  2. Associez la stratégie système AliyunOSSFullAccess au rôle RAM oss-objectmanager.

    Pour plus d'informations, consultez la rubrique Accorder des autorisations à un rôle RAM.

Créer un utilisateur RAM et autoriser l'assomption de rôle

  1. Créez un utilisateur RAM nommé appserver pour le serveur d'applications.

    Pour plus d'informations, consultez la rubrique Créer un utilisateur RAM.

  2. Accordez l'autorisation AliyunSTSAssumeRoleAccess à l'utilisateur RAM appserver afin de lui permettre d'assumer des rôles.

    Pour plus d'informations, consultez la rubrique Accorder des autorisations à un utilisateur RAM.

Obtenir un jeton STS

  1. Le serveur d'applications utilise l'AccessKey de l'utilisateur RAM pour appeler l'opération STS AssumeRole.

    Remarque
    • Avant d'utiliser Alibaba Cloud Command Line Interface (CLI), vous devez l'installer sur votre serveur d'applications et le configurer avec les identifiants de l'utilisateur RAM. Pour plus d'informations, consultez la rubrique Référence CLI STS.

    • Dans cet exemple, le paramètre Policy n'est pas spécifié. Par conséquent, le jeton STS renvoyé hérite de toutes les autorisations du rôle RAM oss-objectmanager. Pour limiter davantage les autorisations du jeton STS, consultez la rubrique Limiter les autorisations d'un jeton STS.

    L'exemple suivant montre comment utiliser Alibaba Cloud CLI pour appeler l'opération AssumeRole :

    aliyun sts AssumeRole --RoleArn 'acs:ram::123456789012****:role/oss-objectmanager' --RoleSessionName 'client-001'
  2. STS renvoie un jeton STS au serveur d'applications. Le jeton STS comprend un AccessKeyId, un AccessKeySecret et un SecurityToken.

    Le code suivant présente un exemple de réponse :

    {
         "AssumedRoleUser": {
             "AssumedRoleId": "391578752573****:client-001",
             "Arn": "acs:ram::123456789012****:role/oss-objectmanager/client-001"
         }, 
         "Credentials": {
             "AccessKeySecret": "yourAccessKeySecret",
             "SecurityToken": "yourSecurityToken",
             "Expiration": "2016-01-13T15:02:37Z",
             "AccessKeyId": "yourAccessKeyId"
         }, 
         "RequestId": "E1779AAB-E7AF-47D6-A9A4-53128708B6CE"
     }
    Remarque

    Le SecurityToken possède une durée de validité courte. Si une session plus longue est nécessaire, le serveur d'applications doit régénérer le jeton STS périodiquement, par exemple toutes les 1 800 secondes.

Limiter les autorisations du jeton STS

Vous pouvez utiliser le paramètre Policy dans l'appel AssumeRole pour restreindre les autorisations d'un jeton STS en fonction de l'utilisateur ou de l'appareil, réduisant ainsi le risque d'élévation de privilèges.

L'exemple suivant accorde l'autorisation de télécharger des objets correspondant au chemin sample-bucket/2015/01/01/*.jpg.

  • Exemple de requête

    aliyun sts AssumeRole --RoleArn 'acs:ram::123456789012****:role/oss-objectmanager' --RoleSessionName 'client-002' --Policy '{"Version":"1", "Statement": [{"Effect":"Allow", "Action":"oss:GetObject", "Resource":"acs:oss:*:*:sample-bucket/2015/01/01/*.jpg"}]}'
    Remarque

    La durée d'expiration par défaut d'un jeton STS est de 3 600 secondes. Vous pouvez définir une durée d'expiration différente à l'aide du paramètre DurationSeconds. Pour plus d'informations, consultez la rubrique AssumeRole.

  • Exemple de réponse

    {
       "AssumedRoleUser": {
           "AssumedRoleId": "391578752573****:client-002",
           "Arn": "acs:ram::123456789012****:role/oss-objectmanager/client-002"
       },
       "Credentials": {
           "AccessKeySecret": "yourAccessKeySecret",
           "SecurityToken": "yourSecurityToken",
           "Expiration": "2016-01-13T15:03:39Z",
           "AccessKeyId": "yourAccessKeyId"
       }, 
       "RequestId": "98835D9B-86E5-4BB5-A6DF-9D3156ABA567"
    }

Utiliser un jeton STS pour accéder à OSS

  1. Le serveur d'applications transmet le jeton STS à l'application mobile.

  2. L'application mobile utilise le jeton STS pour accéder à OSS.

    L'exemple suivant utilise le SDK Android OSS pour télécharger un fichier depuis OSS à l'aide d'un jeton STS.

    // Replace yourEndpoint with the endpoint of the region where your bucket is located. For example, for the China (Hangzhou) region, the endpoint is https://oss-cn-hangzhou.aliyuncs.com.
    String endpoint = "yourEndpoint";
    // Replace yourRegion with the ID of the region where your bucket is located. For example, for the China (Hangzhou) region, the region ID is cn-hangzhou.
    String region = "yourRegion";
    
    // The temporary AccessKey ID and AccessKey Secret obtained from STS.
    String accessKeyId = "yourAccessKeyId";
    String accessKeySecret = "yourAccessKeySecret";
    // The security token obtained from STS.
    String securityToken = "yourSecurityToken";
    
    OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken);
    ClientConfiguration config = new ClientConfiguration();
    config.setSignVersion(SignVersion.V4);
    // Create an OSSClient instance.
    OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
    oss.setRegion(region);
    // Construct a download request.
    GetObjectRequest get = new GetObjectRequest("sample-bucket", "2015/01/01/grass.jpg");
    
    OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
        @Override
         // On success, the GetObject request returns a GetObjectResult containing an input stream. You must process the stream.
        public void onSuccess(GetObjectRequest request, GetObjectResult result) {
            // The request is successful.
            Log.d("asyncGetObject", "DownloadSuccess");
            Log.d("Content-Length", "" + result.getContentLength());
            
            try (InputStream inputStream = result.getObjectContent()) {
                byte[] buffer = new byte[2048];
                int len;
                while ((len = inputStream.read(buffer)) != -1) {
                // Process the data.
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        // The onFailure callback is triggered if the request fails. Handle the exception.
        public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
            if (clientExcepion != null) {
                // Handle client-side exceptions, such as network errors.
                clientExcepion.printStackTrace();
            }
            if (serviceException != null) {
                // Handle service-side exceptions.
                Log.e("ErrorCode", serviceException.getErrorCode());
                Log.e("RequestId", serviceException.getRequestId());
                Log.e("HostId", serviceException.getHostId());
                Log.e("RawMessage", serviceException.getRawMessage());
            }
        }
    });
    // Cancel the task.
    // task.cancel(); 
    // Wait for the task to complete.
    // task.waitUntilFinished();