2011-11-16 6 views
5

Obecnie pracujemy nad wykończeniem aplikacji korzystającej z Phonegapa i spowodowaliśmy problemy z portem Blackberry.Uwierzytelnianie za pośrednictwem OAUTH z dostawcami korzystającymi z Phonegap dla Blackberry

Do tej pory przeglądaliśmy treści dostępne online i nie możemy znaleźć naprawdę ostatecznej odpowiedzi na to pytanie. Wygląda na to, że "prawidłowy" sposób wykonania procesu uwierzytelniania oauth dla Twittera, Facebooka lub Foursquare polegałby na użyciu wtyczki ChildBrowser, utworzeniu instancji okna, a następnie wykorzystaniu go do obsługi procesu.

Słusznie, wydaje się, że brakuje wtyczki ChildBrowser dla Blackberry. Do tej pory przyglądaliśmy się kilku prywatnym projektom na Github, które wyglądają tak, jakby budowały/używały tej możliwości, ale nie jesteśmy pewni, jak kontrolować utworzone okno.

Większość (lub wszystkie?) Z tych wtyczek odnosi się do wywoływania macierzystej przeglądarki Blackberry do obsługi adresów URL, ale w takim razie, jak byłoby pracować nad wywołaniami zwrotnymi, pobrać tokeny i zamknąć okna, ponieważ jest to kolejny proces.

Na przykład, mamy ten kod Concept:

function openWindow() { 
    if (typeof blackberry !== 'undefined') { 
    app_id = SOMETHING_HERE; 
    redirect = 'http://www.facebook.com/connect/login_success.html'; 
    url = 'https://graph.facebook.com/oauth/authorizeclient_id='+app_id+'&redirect_uri='+redirect+'&display=touch&scope=publish_stream'; 
    var args = new blackberry.invoke.BrowserArguments(url); 
    blackberry.invoke.invoke(blackberry.invoke.APP_BROWSER, args); 
      } 
     } 

który działa na otwarcie URL, ale to wszystko. Czy istnieje sposób na uchwycenie okna i wstrzyknięcie niektórych słuchaczy w wydarzenia? Jakie powinno być nasze właściwe podejście?

Dzięki!

Odpowiedz

3

Nie jestem użytkownikiem PhoneGap, ale musieliśmy poradzić sobie w bardzo podobnym scenariuszu - natywna aplikacja wywołuje mobilną przeglądarkę, aby poprosić o przepływ OAuth, a następnie móc obsłużyć wywołanie zwrotne do aplikacji.

Jest to możliwe na urządzeniu BlackBerry za pomocą interfejsu API BrowserContentProviderRegistry. Możesz zarejestrować aplikację, aby była wywoływana za każdym razem, gdy określony typ MIME jest zwracany do przeglądarki. Brzmi skomplikowanie, ale jest dość proste, gdy wszystkie elementy są w grze.

Oto szorstki flow -

  1. Natywna aplikacja wywołuje przeglądarkę na stronę OAuth. Ta część jest łatwa i wydaje się, że masz tę część.
  2. Przekierowanie oAuth musi przejść do adresu URL, który można kontrolować. Coś jak http://mycompany.com/oAuthRedirectHandler.asp.
  3. oAuthRedirectorHandler.asp ma prosty kod tak (wybraliśmy klasyczne ASP, ale można to zrobić w PHP lub dowolny język, można również ignorować bloku Android poniżej) -

    <html><body> 
    <h1>Redirect page</h1> 
    If you are not re-directed, please open the application manually. 
    <% strUA = Request.ServerVariables("HTTP_USER_AGENT") 
    if (InStr(strUA, "BlackBerry")) then  
         Response.Write("Opening appplication on BlackBerry") 
         Response.ContentType="application/x-MyCustomApp" 
    elseif (InStr(strUA, "Android")) then 
         Response.Write("Opening appplication on Android")  
         Response.Redirect("MyCustomApp://mycompany.com") 
    end if %> 
    </body> </html> 
    
  4. W urządzeniu BlackBerry Kod chcesz nowy BrowserContentProvider takiego -

    final class CustomBrowserProvider extends BrowserContentProvider{ 
        String[] ACCEPT = new String[]{"application/x-MyCustomApp}; 
        String appName; 
    
        CustomBrowserProvider(String appName){ 
        this.appName = ApplicationDescriptor.currentApplicationDescriptor().getModuleName(); 
        //cache this appName from the constructor in the invocation code below. 
        } 
    
        public String[] getSupportedMimeTypes() { return ACCEPT;} 
        public String[] getAccept(RenderingOptions context){return ACCEPT;} 
    
        public BrowserContent getBrowserContent(BrowserContentProviderContext context) throws RenderingException { 
        //this is where the callback happens 
        //this is happening in a separate process, raise your main app here using the appName that got passed in 
        //I dont have a sanitized ready to go sample to post here on how to do this, but not too complicated 
        //as a hint use the ApplicationDescriptor and CodeModuleManager classes 
        return null; 
        } 
    } 
    
  5. teraz, w swojej inicjalizacji aplikacji, zarejestruj tę nową BrowserPlugin takiego -

    BrowserContentProviderRegistry converterRegistry = BrowserContentProviderRegistry.getInstance(); 
    converterRegistry.register(new CustomBrowserProvider());    
    

Mam nadzieję, że to pomoże. To nam się bardzo dobrze sprawdziło. Jedyną wadą, jaką mieliśmy tutaj, jest to, że kiedy użytkownik powraca do aplikacji przeglądarki, pozostaje mu pusta strona i nie ma dobrego sposobu na zamknięcie tego na BB.

+0

Wow, wydaje się to naprawdę interesujące. Wielkie dzięki za twój wkład! Postaram się zgłosić to, co odkryłem. – Yaraher

Powiązane problemy