2009-08-03 8 views
0

J'ai développé un ensemble d'API qui vivent sur une application mvc asp.net, mais qui sera utilisé depuis un navigateur accédant à notre site principal (qui vit sur une pile LAMP).Autorisation Jquery refusée - nom de domaine différent

Les noms de domaine ressemblent à ceci:

http://www.mainsite.org

http://apis.www.mainsite.org API (à l'origine, apis.mainsite.org, mais je fait la modification pour tenter de résoudre le problème)

Je fais une requête $ .ajax() à l'API qui à son tour envoie un fichier html pur pour vider une forme d'entrée dans un div. La configuration fonctionne bien quand je cours depuis une page d'accueil qui se trouve sur mon site d'apis, mais quand je mets la même page sur un site en dehors d'apis.www.mainsite.org, j'obtiens une "permission refusée" erreur dans IE sur la première demande au service. J'ai quelques ressources qui disent que je dois implémenter JSONP pour que cela fonctionne correctement et que le script interdomaine soit appelé de cette façon - mais j'espère pouvoir activer cette fonctionnalité tout en retournant le html au lieu de JSON.

Toutes les suggestions seraient grandement appréciées.

Une autre question - une idée de pourquoi une requête XMLhttp de http://mysite.org à http://api.mysite.org serait considérée comme inter-domaine? Est-ce qu'un changement dans le nom de domaine en fait un appel inter-domaine?

Il semble assez courant de séparer le domaine de l'API du domaine de contenu principal, et j'espère qu'il me manquera quelque chose de simple.

Meilleures salutations et merci pour votre temps.

Hal

Répondre

2

Le poste suivant pourrait jeter plus de lumière sur une technique de hack balise script:

Why don't I get a 'same origin policy' warning when using the Google Maps API?

En bref, vous ne pouvez pas faire des appels inter-domaines en utilisant XMLHttpRequest (qui est ce que jquery et ext-js utilisation) . L'étiquette <script> est immunisée contre de telles règles. L'astuce consiste à mettre dans une URL avec des paramètres dont la page retourne JSON en utilisant ces paramètres pour formuler un appel à un rappel dans votre code JavaScript.

EDIT: Pour répondre à votre autre question, la partie domaine de votre URL doit correspondre exactement. Voir l'article de Wikipédia ci-dessous des exemples de cross-domain par rapport appelle du même domaine:

http://en.wikipedia.org/wiki/Same_origin_policy

+0

La "technique de hack de script" est JSONP. – tvanfosson

2

Ceci est appelé « même politique d'origine », ce qui signifie que Javascript ne peut pas accéder à des pages en dehors de son domaine. Oui, tout changement déclenchera un appel interdomaines. Je suggère de faire un lien symbolique vers un répertoire appelé /api qui ferait avancer le répertoire là où vous stockez les fichiers api.example.com. Cela ferait ressembler exactement. Donc api.example.com et example.com/api lien vers le même dossier. Cela réglerait probablement votre situation.

En outre, je trouve que la plupart des sites que je visite utilisent un dossier API pour héberger leur API au lieu d'un sous-domaine, mais là encore, je n'ai pas vraiment travaillé avec les entreprises.

+0

Si le site Web et l'API utilisaient la même pile, je pouvais voir le faire, mais l'API est ASP. NET MVC et le site web est servi avec une pile LAMP. Peut-être que vous pourriez faire fonctionner cela, mais il serait préférable d'implémenter l'API sur la pile LAMP à la place. – tvanfosson

+0

Une autre idée consiste à mettre un proxy, qui est un script PHP qui prend les appels Javascript, puis sort à l'API, récupère les données et les renvoie au client Javascript. Vous pouvez même implémenter la mise en cache. –

+0

Nos règles métier finiront par vivre sous l'API et nous serons forcés de garder cela sur ASP.NET MVC (sous Windows), donc je ne peux pas reconstruire l'API sur LAMP. Cependant, je peux jeter un oeil à la génération d'un proxy PHP pour consommer mes services, que je pourrais fournir à nos concepteurs. BTW - quelqu'un sait comment Google et d'autres grands fournisseurs d'api s'en tirer avec? Est-ce qu'ils permettent seulement l'interaction JSONP? – Hal

Questions connexes