Pour utiliser le SDK Object Storage Service (OSS) pour Node.js, vous devez fournir des identifiants d'accès afin d'authentifier vos requêtes. Le SDK prend en charge plusieurs méthodes de configuration des identifiants, ce qui vous permet de choisir celle qui correspond le mieux à vos exigences en matière de sécurité et d'exploitation.
Prérequis
Le SDK OSS pour Node.js est installé. Pour plus d'informations, consultez la rubrique Installer le SDK OSS pour Node.js.
Sélectionner une méthode de configuration des identifiants
Le tableau suivant compare les différentes méthodes de configuration des identifiants afin de vous aider à choisir la plus adaptée.
|
Méthode |
Scénario |
Paire AccessKey ou jeton de sécurité requis |
Logique sous-jacente |
Durée de validité des identifiants |
Méthode de rotation ou d'actualisation des identifiants |
|
Les applications sont déployées et exécutées dans un environnement sécurisé et stable, non vulnérable aux attaques externes, et doivent accéder aux services cloud pendant une longue période sans rotation fréquente des identifiants. |
Oui |
Paire AccessKey |
Long terme |
Rotation manuelle |
|
|
Les applications sont déployées et exécutées dans un environnement non fiable, auquel cas vous souhaitez gérer la durée de validité des identifiants et les ressources accessibles. |
Oui |
Jeton de sécurité |
Temporaire |
Actualisation manuelle |
|
|
Les applications doivent être autorisées à accéder aux services cloud, par exemple pour un accès intercomptes. |
Oui |
Jeton de sécurité |
Temporaire |
Actualisation automatique |
|
|
Les applications sont déployées et exécutées sur des instances Elastic Compute Service (ECS), des instances de conteneur élastiques et des nœuds de travail Container Service for Kubernetes (ACK). |
Non |
Jeton de sécurité |
Temporaire |
Actualisation automatique |
|
|
Des applications non fiables sont déployées et exécutées sur des nœuds de travail ACK. |
Non |
Jeton de sécurité |
Temporaire |
Actualisation automatique |
|
|
Les applications nécessitent des identifiants d'accès provenant de systèmes externes. |
Non |
Jeton de sécurité |
Temporaire |
Actualisation automatique |
Méthode 1 : Utiliser une paire AccessKey
L'utilisation d'une paire AccessKey à long terme est simple, mais moins sécurisée. Elle convient aux applications évoluant dans des environnements hautement sécurisés. Pour une meilleure sécurité, utilisez toujours la paire AccessKey d'un utilisateur RAM disposant des autorisations minimales requises, et non celle de votre compte Alibaba Cloud. Pour savoir comment obtenir une paire AccessKey, consultez la rubrique CreateAccessKey.
Un compte Alibaba Cloud dispose d'un accès complet à toutes les ressources du compte. La divulgation de la paire AccessKey du compte Alibaba Cloud constitue une menace critique pour le système. Par conséquent, utilisez la paire AccessKey d'un utilisateur RAM auquel seules les autorisations strictement nécessaires ont été accordées pour initialiser un fournisseur d'identifiants.
-
Configurez les variables d'environnement.
Mac OS X/Linux/Unix
export ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>Windows
set ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> -
Utilisez la paire AccessKey pour initialiser le client.
const OSS = require("ali-oss"); // Initialize the OSSClient instance. const client = new OSS({ // Obtain the AccessKey ID from the environment variable. accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID, // Obtain the AccessKey secret from the environment variable. accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET }); // listBuckets const buckets = await client.listBuckets(); console.log(buckets);
Méthode 2 : Utiliser un jeton de sécurité
Appelez l'opération AssumeRole de STS en tant qu'utilisateur RAM et spécifiez la durée de validité maximale du jeton de sécurité. Vous obtenez ainsi un jeton de sécurité.
-
Configurez les variables d'environnement.
Mac OS X/Linux/Unix
export ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> export ALIBABA_CLOUD_SECURITY_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>Windows
set ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> set ALIBABA_CLOUD_SECURITY_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN> -
Utilisez les identifiants d'accès temporaires pour initialiser l'instance OSSClient.
const OSS = require("ali-oss"); // Initialize the OSSClient instance. const client = new OSS({ // Obtain the AccessKey ID from the environment variable. accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID, // Obtain the AccessKey secret from the environment variable. accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET, // Obtain the security token from the environment variable. stsToken: process.env.ALIBABA_CLOUD_SECURITY_TOKEN }); // listBuckets const buckets = await client.listBuckets(); console.log(buckets);
Méthode 3 : Utiliser RAMRoleARN
La logique sous-jacente de cette méthode consiste à utiliser un jeton de sécurité obtenu auprès de STS pour configurer les identifiants d'accès. Après avoir spécifié le nom de ressource Alibaba Cloud (ARN) d'un rôle RAM, l'outil Credentials obtient le jeton de sécurité depuis STS. Vous pouvez également utiliser le paramètre policy pour limiter les autorisations du rôle RAM.
Utilisez la paire AccessKey et RAMRoleARN pour initialiser l'instance OSSClient.
const Credential = require("@alicloud/credentials");
const OSS = require("ali-oss");
// Use the ARN of your RAM role to initialize the Credentials client.
const credentialsConfig = new Credential.Config({
// Specify the credential type.
type: "ram_role_arn",
// Obtain the AccessKey ID from the environment variable.
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// Obtain the AccessKey secret from the environment variable.
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
// Specify the ARN of the RAM role that you want your application to assume by specifying the ALIBABA_CLOUD_ROLE_ARN environment variable. Example: acs:ram::123456789012****:role/adminrole.
roleArn: '<RoleArn>',
// Specify the role session name by specifying the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
roleSessionName: '<RoleSessionName>',
// Optional. Specify limited permissions for the RAM role. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
// policy: '<Policy>',
roleSessionExpiration: 3600
});
const credentialClient = new Credential.default(credentialsConfig);
const credential = await credentialClient.getCredential();
// Initialize the OSSClient instance.
const client = new OSS({
accessKeyId:credential.accessKeyId,
accessKeySecret: credential.accessKeySecret,
stsToken: credential.securityToken,
refreshSTSTokenInterval: 0, // Specify that Credential manages the update of the AccessKey ID, AccessKey secret, and security token.
refreshSTSToken: async () => {
const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
return {
accessKeyId,
accessKeySecret,
stsToken: securityToken,
};
}
});
// listBuckets
const buckets = await client.listBuckets();
console.log( buckets);
Méthode 4 : Utiliser le rôle RAM obtenu via le mode de renforcement de la sécurité des métadonnées de l'instance ECS
La logique sous-jacente de cette méthode consiste à utiliser un jeton de sécurité obtenu auprès de STS pour configurer les identifiants d'accès. L'outil Credentials obtient automatiquement le rôle RAM attaché à une instance ECS et récupère le jeton de sécurité du rôle attaché via le serveur de métadonnées de l'instance ECS. Ce jeton de sécurité est utilisé pour initialiser un client Credentials. Utilisez l'outil Credentials pour lire le jeton de sécurité et initialiser le client Credentials.
const Credential = require("@alicloud/credentials");
const OSS = require("ali-oss");
// Use the ARN of your RAM role to initialize the Credentials client.
const credentialsConfig = new Credential.Config({
// Specify the credential type.
type: "ecs_ram_role",
// Optional. Specify the name of the RAM role attached to an ECS instance by specifying the ALIBABA_CLOUD_ECS_METADATA environment variable. If you do not specify this parameter, the name of the RAM role attached to an ECS instance is automatically obtained. We recommend that you specify this parameter to reduce the number of requests.
roleName: '<RoleName>'
});
const credentialClient = new Credential.default(credentialsConfig);
const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
// Initialize the OSSClient instance.
const client = new OSS({
accessKeyId,
accessKeySecret,
stsToken: securityToken,
refreshSTSTokenInterval: 0, // Specify that Credential manages the update of the AccessKey ID, AccessKey secret, and security token.
refreshSTSToken: async () => {
const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
return {
accessKeyId,
accessKeySecret,
stsToken: securityToken,
};
}
});
// listBuckets
const buckets = await client.listBuckets();
console.log(buckets);
Méthode 5 : Utiliser OIDCRoleARN
Une fois qu'un rôle RAM est configuré sur le nœud de travail ACK, les applications s'exécutant dans les pods de ce nœud peuvent obtenir le jeton de sécurité du rôle via le serveur de métadonnées, à l'instar des applications sur les instances ECS. Toutefois, pour les applications non fiables, telles que le code soumis par les clients, il peut être nécessaire de restreindre l'accès au jeton de sécurité du rôle RAM. Afin de sécuriser les ressources cloud tout en permettant aux applications non fiables d'obtenir les jetons nécessaires et de minimiser les autorisations, utilisez la fonctionnalité Rôles RAM pour les comptes de service. ACK crée et monte des fichiers de jetons OpenID Connect pour différents pods d'application, en transmettant les informations de configuration aux variables d'environnement. L'outil Credentials récupère ces configurations et appelle l'opération AssumeRoleWithOIDC de STS pour obtenir le jeton de sécurité du rôle attaché. Pour plus d'informations, consultez la rubrique Utiliser RRSA pour le contrôle d'accès au niveau des pods.
Configurez OIDCRoleARN comme identifiant d'accès pour initialiser le client.
const OSS = require("ali-oss");
const Credential = require("@alicloud/credentials");
const credentialsConfig = new Credential.Config({
// Specify the credential type.
type: "oidc_role_arn",
// Specify the ARN of the RAM role by specifying the ALIBABA_CLOUD_ROLE_ARN environment variable.
roleArn: '<RoleArn>',
// Specify the ARN of the OIDC IdP by specifying the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable.
oidcProviderArn: '<OidcProviderArn>',
// Specify the path of the OIDC token file by specifying the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable.
oidcTokenFilePath: '<OidcTokenFilePath>',
// Specify the role session name by specifying the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
roleSessionName: '<RoleSessionName>',
// Optional. Specify limited permissions for the RAM role. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
// policy: "<Policy>",
// Specify the validity period of the session.
roleSessionExpiration: 3600
});
const credentialClient = new Credential.default(credentialsConfig);
const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
const client = new OSS({
accessKeyId,
accessKeySecret,
stsToken: securityToken,
refreshSTSTokenInterval: 0, // Specify that Credential manages the update of the AccessKey ID, AccessKey secret, and security token.
refreshSTSToken: async () => {
const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
return {
accessKeyId,
accessKeySecret,
stsToken: securityToken,
};
}
});
const buckets = await client.listBuckets();
console.log(buckets);
Méthode 6 : Utiliser CredentialsURI
Si votre application doit obtenir des identifiants Alibaba Cloud auprès d'un système externe pour une gestion flexible et un accès sans clé, utilisez CredentialsURI pour initialiser un fournisseur d'identifiants. Cette méthode utilise un jeton de sécurité de STS pour configurer les identifiants d'accès. L'outil Credentials récupère le jeton à l'aide de l'URI spécifié pour initialiser une instance OSSClient sur le client. Cette approche minimise les risques associés à la gestion manuelle des paires AccessKey ou des jetons de sécurité. Notez que le service backend fournissant la réponse CredentialsURI doit actualiser automatiquement le jeton de sécurité afin de garantir que votre application dispose toujours d'identifiants valides.
-
Pour permettre à l'outil Credentials d'analyser et d'utiliser correctement un jeton de sécurité, l'URI doit respecter le protocole de réponse suivant :
Code d'état de la réponse : 200
-
Structure du corps de la réponse :
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
-
Configurez CredentialsURI comme identifiant d'accès pour initialiser le client.
const OSS = require("ali-oss"); const Credential = require("@alicloud/credentials"); // Use the URI of the credential to initialize the Credentials client. const credentialsConfig = new Credential.Config({ // Specify the credential type. type: "credentials_uri", // Specify the URI of the credential in the http://local_or_remote_uri/ format by specifying the ALIBABA_CLOUD_CREDENTIALS_URI environment variable. credentialsURI: '<CredentialsUri>' }); const credentialClient = new Credential.default(credentialsConfig); const credential = await credentialClient.getCredential(); // Initialize the OSSClient instance. const client = new OSS({ accessKeyId: credential.accessKeyId, accessKeySecret: credential.accessKeySecret, stsToken: credential.securityToken, refreshSTSTokenInterval: 0, // Specify that Credential manages the update of the AccessKey ID, AccessKey secret, and security token. refreshSTSToken: async () => { const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential(); return { accessKeyId, accessKeySecret, stsToken: securityToken, }; } }); // listBuckets const buckets = await client.listBuckets(); console.log(buckets);
Étapes suivantes
Après avoir initialisé le fournisseur d'identifiants, vous devez l'utiliser pour créer une instance OSSClient. Pour plus d'informations, consultez la rubrique Initialiser le SDK OSS pour Node.js.