Kamil Zasada

Kamil Zasada Student,
Politechnika
Wrocławska

Temat: WebService: Security error accessing url. Unable to load...

Hej.

Od kilku dni walczę z aplikacją Flex komunikującą się z Web Serwisem. Do komunikacji wykorzystuję komponent <s:WebService>. Lokalnie aplikacja działa, jednak po eksporcie na serwer zewnętrzny (opcja Project->Export Release Build...), Flash Player zwraca następujący błąd:

Security error accessing url
Unable to load WSDL. If currently online, please verify the URI and/or format of the WSDL (http://135.196.210.143/OpenBabel.asmx?wsdl)

Oczywiście plik WSDL jest cały czas dostępny. Dodałem również w głównym folderze domeny plik crossdomain.xml o zawartości:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" />
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

Niestety nadal to nie pomaga, a aplikacja zwraca błąd. Aplikacja znajduje się pod adresem:

http://kamilzasada.pl/resources/openbabel/OpenBabel.html

Proszę o pomoc. Kolejną noc przekopuję internet i nie mogę znaleźć rozwiązania, które sprawdziłoby się w moim przypadku :/

Z góry dziękuję za jakąkolwiek wskazówkę :)

konto usunięte

Temat: WebService: Security error accessing url. Unable to load...

Plik crossdomain musi być na serwerze na którym znajduje się WSDL, powinien być dostępny tutaj: http://135.196.210.143/crossdomain.xml
Kamil Zasada

Kamil Zasada Student,
Politechnika
Wrocławska

Temat: WebService: Security error accessing url. Unable to load...

A czy to trochę nie zaburza koncepcji architektury SOA? Aplikacja ta ma na celu tworzenie workflow z web serwisów udostępnianych przez różne ośrodki naukowe. Dodając nowy web serwis, musiałbym każdorazowo kontaktować się z takim ośrodkiem aby umieścił na swoim serwerze plik crossdomain.xml? Korzystam z zewnętrznym web serwisów i nie mam dostępu do nich. Jest jakaś opcja obejścia tego? I dlaczego na localhost aplikacja działa?
Kamil Zasada

Kamil Zasada Student,
Politechnika
Wrocławska

Temat: WebService: Security error accessing url. Unable to load...

Plik WSDL mogę załadować i web serwis działa (sprawdzałem to poprzez panel 'Test Operation' po dodaniu web serwisu z kreatora Flash Builder), gdy aplikacja działa lokalnie. Czyli wydaje mi się, że nie jest to problem dostępu do serwisu. Sądzę, że problem leży w polityce zabezpieczeń Flash Player - wywołanie funkcji spoza mojej domeny.

konto usunięte

Temat: WebService: Security error accessing url. Unable to load...

Tak jak napisał Robert... crossdomain, ktory jest czescia zabezpieczen flasha.
Przynajmniej flash moze w taki sposob ;)
Kamil Zasada

Kamil Zasada Student,
Politechnika
Wrocławska

Temat: WebService: Security error accessing url. Unable to load...

Ok...plik crossdomain.xml jest częścią zabezpieczeń flash player. Czyli rozumiem, że jak chcę uzyskać dostęp do zasobów spoza mojej domeny (na której znajduje się aplikacja flex), tworzę takowy plik na swoim serwerze. Tak też zrobiłem:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" />
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

Zezwoliłem na dostęp z każdej domeny (domain="*"), czyli mogę wywołać każdy web serwis? Ale dalej Flash Player rzuca błędami bezpieczeństwa.

Na prawdę Robercie muszę umieścić plik crossdomain.xml na serwerze, na którym znajduje się Web Serwis?? Jeśli nie mam dostępu do tego serwera, aby umieścić tam plik crossdomain to jak mam mieć dostęp do danej usługi? Brak możliwości wywoływania zewnętrznych web serwisów z poziomu aplikacji flex byłby trochę słaby :/
Łukasz Błachowicz

Łukasz Błachowicz codziennie wymiatam
i odkurzam

Temat: WebService: Security error accessing url. Unable to load...

Taki jest aktualny model zabezpieczeń. Od biedy można napisać jakieś szybkie proxy w php. Lokalnie działa, bo lokalnie działać powinno, jeśli odpowiednio zmodyfikuje się opcje fp.

konto usunięte

Temat: WebService: Security error accessing url. Unable to load...

To prawda, że crossdomain.xml jest częścią zabezpieczeń flash playera, ale jest odpowiedzialna za ochronę innych domen przed tobą a nie twojej przed tobą (a tylko wtedy umieszczanie crossdomain w twojej domenie miałoby sens), stąd to właściciel danej domeny może decydować o tym kto ma dostęp do jego serwisów.

Wiem, że na pierwszy rzut oka całe te zabezpieczenia wydają się trochę przesadzone, ale na pocieszenie dodam, że w przypadku Javascriptu jest podobnie. Zasada jest taka, że kod wykonujący się u użytkownika i w kontekście jego sesji może działać tylko w granicach serwera z którego został przez użytkownika ściągnięty. Dla uzasadnienia uproszczony przykład - wchodzisz sobie na stronę banku i logujesz się, w drugiej zakładce otwierasz gazetę na której są banerki reklamowe we Flashu i Javascript. Teraz, gdyby tego zabezpieczenia nie było, każdy z nich mógłby (z twojej przeglądarki!) wysłać zapytanie do strony banku. Ponieważ bank nie ma crossdomain.xml który na to zezwala nic się nie dzieje.

Tak jak pisał Łukasz, jedną z metod jest napisanie proxy tak, żeby zapytania do serwisów szły w ten sposób: Flash -> Twój serwer -> Ich serwer -> Twój serwer -> Flash.Robert Bąk edytował(a) ten post dnia 29.12.10 o godzinie 13:43
Kamil Zasada

Kamil Zasada Student,
Politechnika
Wrocławska

Temat: WebService: Security error accessing url. Unable to load...

Poczytałem sobie trochę na ten temat i upewniłem się, że tak wygląda model zabezpieczeń FP (podobnie jak w JS).

Informacje na temat eksploracji danych:
http://help.adobe.com/en_US/Flex/4.0/AccessingData/WSb...

Zabezpieczenia Flash Player:
http://help.adobe.com/en_US/flashbuilder/using/WS6f97d...

Czyli bez możliwości umieszczenia pliku crossdomain.xml na serwerze udostępniającym dane, jedyną opcją pozostaje mi przygotowanie proxy. Jeśli dobrze rozumiem, to teraz większość pracy będę musiał przerzucić powiedzmy na PHP - we Flexie znajdzie się jedynie żądanie pobrania konkretnych danych, a PHP będzie łączył się z Web Service i przekazywał sformatowane dane z powrotem do Flex'a? A może ktoś z Was spotkał się z jakimś darmowym (w co wątpię) hostingiem LiveCycle Data Service albo BlazeDS?
Piotr Mederak

Piotr Mederak Development Team
Leader

Temat: WebService: Security error accessing url. Unable to load...


<?php
// PHP Proxy
// Responds to both HTTP GET and POST requests
//
// Author: Abdul Qabiz
// March 31st, 2006
//

// Get the url of to be proxied
// Is it a POST or a GET?
$url = ($_POST['url']) ? $_POST['url'] : $_GET['url'];
$headers = ($_POST['headers']) ? $_POST['headers'] : $_GET['headers'];
$mimeType =($_POST['mimeType']) ? $_POST['mimeType'] : $_GET['mimeType'];


//Start the Curl session
$session = curl_init($url);

// If it's a POST, put the POST data in the body
if ($_POST['url']) {
$postvars = '';
while ($element = current($_POST)) {
$postvars .= key($_POST).'='.$element.'&';
next($_POST);
}
curl_setopt ($session, CURLOPT_POST, true);
curl_setopt ($session, CURLOPT_POSTFIELDS, $postvars);
}

// Don't return HTTP headers. Do return the contents of the call
curl_setopt($session, CURLOPT_HEADER, ($headers == "true") ? true : false);

curl_setopt($session, CURLOPT_FOLLOWLOCATION, true);
//curl_setopt($ch, CURLOPT_TIMEOUT, 4);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

// Make the call
$response = curl_exec($session);

if ($mimeType != "")
{
// The web service returns XML. Set the Content-Type appropriately
header("Content-Type: ".$mimeType);
}

echo $response;

curl_close($session);

?>


i tyle.

odpalasz taki skrypt w nastepujacy sposob:

http://moja.domena.pl/ten_skrypt.php?url=http://to.chc...
Kamil Zasada

Kamil Zasada Student,
Politechnika
Wrocławska

Temat: WebService: Security error accessing url. Unable to load...

Dzięki. Proxy, które podałeś przyda mi się w przypadku odwołań do serwisów RESTful. Niestety przy komunikacji z web serwisami poprzez protokół SOAP (tak jak pisałem wcześniej) będzie ono bezwartościowe.

Tak jak pisałem będę po prostu musiał we Flexie wywoływać swój skrypt PHP, korzystając z klasy HTTPService, z odpowiednimi parametrami, np. http://mojadomena.pl/skrypt.php?zmienna1=wartosc1&zmie.... Zmienne te będą argumentami zdalnej funkcji, której specyfikację otrzymam w pliku wsdl. I cała logika spadnie na PHP, w którym to użyć będę musiał klasy SoapClient, która połączy się z danym serwisem i pobierze stosowne dane. A we Flexie jedynie wyświetlę dane otrzymane od PHP. Innej drogi nie widzę :/ Niestety w tym przypadku nie wykorzystam dobrodziejstw komponentu <s:WebService>. <na razie nie miałem jeszcze chwili, aby przygotować takie proxy>

Następna dyskusja:

Domyślnie [AMFPHP] Duza ta...




Wyślij zaproszenie do