web-dev-qa-db-fra.com

Les bases de données HTML5 et localStorage peuvent-elles être partagées entre les sous-domaines?

J'essaie de partager des données entre des sous-domaines à l'aide de Safari. Je voudrais utiliser une base de données HTML5 (en particulier localStorage car mes données ne sont que des paires clé-valeur). Cependant, il semble que les données stockées dans domain.com ne soient pas accessibles depuis sub.domain.com (ou vice versa). Existe-t-il un moyen de partager une seule base de données dans cette situation?

60
Sebastian Celis

Mise à jour 2016

Cette bibliothèque de Zendesk a fonctionné pour moi.

Échantillon:

Hub

// Config s.t. subdomains can get, but only the root domain can set and del
CrossStorageHub.init([
  {Origin: /\.example.com$/,            allow: ['get']},
  {Origin: /:\/\/(www\.)?example.com$/, allow: ['get', 'set', 'del']}
]);

Noter la $ pour faire correspondre la fin de la chaîne. L'expression régulière dans l'exemple ci-dessus correspondra à des origines telles que valid.example.com, mais non invalid.example.com.malicious.com.

Client

var storage = new CrossStorageClient('https://store.example.com/hub.html');

storage.onConnect().then(function() {
  return storage.set('newKey', 'foobar');
}).then(function() {
  return storage.get('existingKey', 'newKey');
}).then(function(res) {
  console.log(res.length); // 2
}).catch(function(err) {
  // Handle error
});

Vérifier https://stackoverflow.com/a/39788742/50646

12
super1ha1

Il existe un moyen simple d'utiliser quoi que ce soit entre domaines, il suffit de créer une page simple qui sera incluse en tant que proxy iframe hébergé sur le domaine auquel vous essayez d'accéder, envoyer PostMessage à cet iframe et à l'intérieur de l'iframe vous faites votre manipulation de base de données LocalStorage. Voici un lien vers article qui le fait avec lcoalStorage . Et voici démo qui envoie un message à une autre page du sous-domaine vérifiez le code source, il utilise iframe et PostMessage.

[~ # ~] modifier [~ # ~] : Nouveau version de la bibliothèque sysend.js (utilisé par la démo ci-dessus) utilisez BroadcastChannel si le navigateur le prend en charge, mais il nécessite toujours Iframe. La version récente simplifie également l'utilisation des messages d'origine croisée, vous avez le code HTML de l'iframe dans le référentiel, que vous pouvez utiliser (ou vous pouvez utiliser un fichier html simple avec une seule balise de script avec la lib) et dans le parent, vous avez juste besoin d'appeler une fonction sysend.proxy('https://example.com'); où example.com doit avoir proxy.html fichier (vous pouvez également utiliser votre propre nom de fichier et un chemin différent).

9
jcubic

Google Chrome bloque l'accès localStoage à partir d'un iFrame dans un autre domaine par défaut, à moins que le cookie tiers ne soit activé et que Safari sur iPhone ... la seule solution semble être d'ouvrir le domaine parent sur un domaine différent et ensuite envoyer à l'enfant via window.postMessage mais semble laid et sournois sur les téléphones ...

4
Mad Scientist