Le SDK Object Storage Service (OSS) pour iOS propose le mode d'authentification STS, le mode autosigné et les URL présignées afin de garantir la sécurité des données mobiles.
Notes
Lorsque vous utilisez le mode d'authentification STS ou le mode autosigné, assurez-vous que la fonction de rappel utilisée peut renvoyer le jeton de sécurité et la signature. Si vous devez obtenir le jeton et la signature depuis le serveur d'application en envoyant une requête dans la fonction de rappel, nous vous recommandons d'appeler les opérations API synchrones incluses dans la bibliothèque réseau. La fonction de rappel s'exécute dans le thread enfant de la requête générée par le SDK et ne bloque pas le thread principal.
Mode d'authentification STS
Pour accéder à OSS à l'aide des informations d'identification temporaires fournies par STS, procédez comme suit :
-
Obtenez des informations d'identification temporaires.
Les informations d'identification temporaires contiennent un jeton de sécurité et une paire AccessKey temporaire. Une paire AccessKey se compose d'un AccessKey ID et d'un AccessKey Secret. La durée de validité minimale des informations d'identification temporaires est de 900 secondes. La durée de validité maximale correspond à la durée de session maximale spécifiée pour le rôle actuel. Pour plus d'informations, consultez Spécifier la durée de session maximale pour un rôle RAM.
Vous pouvez utiliser l'une des méthodes suivantes pour obtenir des informations d'identification temporaires :
-
Méthode 1
Appelez l'opération AssumeRole.
-
Méthode 2
Vous pouvez obtenir des informations d'identification temporaires à l'aide des SDK STS pour divers langages.
-
-
Utilisez les informations d'identification temporaires pour initialiser le SDK OSS pour iOS.
id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];RemarqueVous pouvez utiliser OSSAuthCredentialProvider pour initialiser le SDK OSS pour iOS. Pour plus d'informations, consultez Initialisation.
Lorsque vous initialisez le SDK à l'aide d'informations d'identification temporaires, tenez compte de la période de validité du jeton STS. L'exemple de code suivant montre comment déterminer la période de validité d'un jeton STS :
NSDateFormatter * fm = [NSDateFormatter new]; fm.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; [fm setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; NSDate *expirationDate = [fm dateFromString:@"<StsToken.Expiration>"]; NSTimeInterval interval = [expirationDate timeIntervalSinceDate:[NSDate date]]; // The STS token is about to expire within less than five minutes. if (interval < 5 * 60) { id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential]; }-
Mettre à jour manuellement le jeton STS
Lorsque le jeton STS est sur le point d'expirer, vous pouvez créer une nouvelle instance OSSClient ou mettre à jour CredentialProvider à l'aide de la méthode suivante :
id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential]; -
Mettre à jour automatiquement le jeton STS
Si vous souhaitez que le SDK mette automatiquement à jour le jeton STS, vous devez implémenter un rappel dans votre application. Ce rappel obtient un jeton de fédération (jeton STS) et le renvoie au SDK. Le SDK utilise le jeton STS pour générer des signatures. Lorsque le jeton STS doit être mis à jour, le SDK appelle le rappel pour obtenir un nouveau jeton.
id<OSSCredentialProvider> credential = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * { // Implement a function that obtains a federation token and returns it as an OSSFederationToken object. // If the federation token is not obtained, nil is returned. OSSFederationToken * token; // Obtain a federation token from your server. ... return token; }]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];RemarqueSi vous obtenez tous les champs nécessaires à la génération d'un jeton STS par d'autres moyens, vous pouvez renvoyer directement le jeton dans le rappel. Dans ce cas, vous devez mettre à jour manuellement le jeton, puis reconfigurer OSSCredentialProvider de l'instance OSSClient.
Si l'URL du serveur à partir duquel vous demandez un jeton est http://localhost:8080/distribute-token.json, la réponse d'exemple suivante est renvoyée :
{ "StatusCode": 200, "AccessKeyId":"STS.iA645eTOXEqP3cg3****", "AccessKeySecret":"rV3VQrpFQ4BsyHSAvi5NVLpPIVffDJv4LojU****", "Expiration":"2015-11-03T09:52:59Z", "SecurityToken":"CAES7QIIARKAAZPlqaN9ILiQZPS+JDkS/GSZN45RLx4YS/p3OgaUC+oJl3XSlbJ7StKpQ****" }L'exemple de code suivant montre comment implémenter OSSFederationCredentialProvider :
id<OSSCredentialProvider> credential2 = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * { // Create a request to access your application server. NSURL * url = [NSURL URLWithString:@"http://localhost:8080/distribute-token.json"]; // Use a request to set the parameters required by your server. NSURLRequest * request = [NSURLRequest requestWithURL:url]; OSSTaskCompletionSource * tcs = [OSSTaskCompletionSource taskCompletionSource]; NSURLSession * session = [NSURLSession sharedSession]; // Send the request. NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { [tcs setError:error]; return; } [tcs setResult:data]; }]; [sessionTask resume]; // Wait until the response to the request is returned. [tcs.task waitUntilFinished]; // Parse the returned results. if (tcs.task.error) { NSLog(@"get token error: %@", tcs.task.error); return nil; } else { // The returned data is in the JSON format. Parse the data to obtain the values of the fields of the token. NSDictionary * object = [NSJSONSerialization JSONObjectWithData:tcs.task.result options:kNilOptions error:nil]; OSSFederationToken * token = [OSSFederationToken new]; token.tAccessKey = [object objectForKey:@"AccessKeyId"]; token.tSecretKey = [object objectForKey:@"AccessKeySecret"]; token.tToken = [object objectForKey:@"SecurityToken"]; token.expirationTimeInGMTFormat = [object objectForKey:@"Expiration"]; NSLog(@"get token: %@", token); return token; } }];
-
URL présignées
Remarques d'utilisation
-
Lorsque vous utilisez un SDK OSS pour générer une URL présignée, le SDK utilise un algorithme spécifique basé sur les informations clés stockées sur l'ordinateur local pour calculer une signature et l'ajouter à une URL, garantissant ainsi la validité et la sécurité de l'URL. Les opérations de calcul et de construction de l'URL sont effectuées sur le client. Vous n'avez pas besoin d'envoyer de requêtes au serveur via le réseau. Ainsi, vous n'avez pas besoin d'accorder d'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, vous devez vous assurer 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, vous devez accorder l'autorisation oss:PutObject au principal. Si un principal souhaite télécharger ou afficher un objet à l'aide d'une URL présignée, vous devez accorder l'autorisation oss:GetObject au principal.
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.