通过oAUTH通过使用Phonegap for Blackberry的提供商进行身份验证

时间:2011-11-16 16:28:04

标签: blackberry oauth cordova

我们目前正致力于使用Phonegap的应用程序的最后润色,并且已经遇到了Blackberry端口的一些问题。

到目前为止,我们一直在审查在线提供的内容,但无法找到真正最终的答案。对于Twitter,Facebook或Foursquare来说,制作和oauth身份验证过程的“正确”方式似乎是使用ChildBrowser插件,实例化一个窗口,然后使用它来处理该过程。

正确地说,似乎缺少Blackberry的ChildBrowser插件。到目前为止,我们一直在寻找Github上的几个私有项目,看起来他们构建/使用了这个功能,但我们不确定如何控制创建的窗口。

这些插件中的大多数(或全部?)是指调用本机Blackberry浏览器来处理URL,但是如何处理回调,获取令牌并关闭窗口,因为它是另一个进程。

例如,我们有这个概念代码:

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);
            }
        }

哪个用于打开网址,但就是这样。有没有办法在窗口上获取句柄并为事件注入一些监听器?我们的正确方法应该是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

我不是PhoneGap用户,但我们确实必须处理一个非常类似的场景 - 本机应用程序调用移动浏览器来提示oAuth流,然后能够处理对该应用程序的回调。

使用BrowserContentProviderRegistry API在BlackBerry上可以实现此功能。只要将特定MIME类型返回到浏览器,您就可以注册要调用的应用程序。听起来很复杂,但是当所有部分都在播放时它相当简单。

这是粗略的流程 -

  1. 原生应用程序调用浏览器到oAuth页面。这部分很容易,看起来你有这个部分。
  2. oAuth重定向需要转到您可以控制的网址。像http://mycompany.com/oAuthRedirectHandler.asp这样的东西。
  3. oAuthRedirectorHandler.asp有这样简单的代码(我们选择了经典的ASP,但这可以用PHP或任何语言完成,你也可以忽略下面的Android块) -

    <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. 在您的BlackBerry代码中,您需要一个像这样的新BrowserContentProvider -

    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. 现在,在您的应用程序初始化中,像这样注册这个新的BrowserPlugin -

     BrowserContentProviderRegistry converterRegistry = BrowserContentProviderRegistry.getInstance();
     converterRegistry.register(new CustomBrowserProvider());            
    
  6. 希望这会有所帮助。这对我们来说非常有效。我们在这里遇到的一个缺点是,当用户返回浏览器应用程序时,他们会留下一个空页面,并且没有好办法在BB中关闭它。