Android Webview Facebook 登录

Posted

技术标签:

【中文标题】Android Webview Facebook 登录【英文标题】:Android Webview Facebook Login 【发布时间】:2011-10-09 17:51:27 【问题描述】:

在我的应用程序中,我想让用户能够使用他们的 Facebook 帐户登录。经过一些搜索,我能够弄清楚这一点,尽管我认为这种方式不是最好的方法。我在 UI 中使用了 webview,并使用 webviewclient 来感知 url 切换。据我了解,在 android 上,我必须在我的 webviewclient 中处理所有重定向(Facebook 重定向,当用户设置他/她的电子邮件和密码时会发生几次重定向)。但我只需要解析我的输出 xml 并根据输出结果做出决定(重定向到我的家庭活动或失败等)。这是我的代码,如果有更合适的方法,请提出您的建议。

public class FbLoginActivity extends Activity 

    String fbLoginBaseUrl = "my server url/facebook/redirector.jsp?";
    private ProgressDialog progressBar; 
    WebView webView;
    int count = 0;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fb_login);

        fbLoginBaseUrl += "usdId=NoSession:";
        fbLoginBaseUrl += Subroutines.getInstance().getDeviceId() + "_L";

        webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setjavascriptEnabled(true);
        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        progressBar = ProgressDialog.show(FbLoginActivity.this, "", "Page is loading...");
        webView.setWebViewClient(new HelloWebViewClient());

        webView.loadUrl(fbLoginBaseUrl);

    

    private class HelloWebViewClient extends WebViewClient 
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) 
            view.loadUrl(url);
            Log.v(Subroutines.TAG, url);
            return true;
        
        @Override
        public void onPageFinished(WebView view, String url) 
            Log.i(Subroutines.TAG, "Finished loading URL: " +url);

            // if login screen loading finishes, cancel the progressdialog..
            // twice redirecting happens to this sub url..
            String subFace = "m.facebook.com/login.php";
            if(url.indexOf(subFace) != -1 && ++count == 2)
                if (progressBar.isShowing()) 
                    progressBar.cancel();
                
            
            // Permission redirecting..
            String loginSub = "www.facebook.com/connect/uiserver.php?method=permissions.request";
            if(url.indexOf(loginSub) != -1)
                progressBar = ProgressDialog.show(FbLoginActivity.this, "", "Logging in...");
            
            // finally if my server makes a response..
            String sub = "my server url/facebook/connect.jsp";
            if(url.indexOf(sub) != -1)
                Log.v(Subroutines.TAG, "my server makes a response..");

                // xml parsing stuff..
                // use url content to parse
            
        
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
            Log.e(Subroutines.TAG, "Error: " + description);
        
    

【问题讨论】:

【参考方案1】:

我会得到 Facebook SDK 并使用它们的功能

简而言之,您可以这样做:

public Facebook facebook = new Facebook("appID");

然后在创建或任何地方:

facebook.authorize(this,String[] YourNeededPermissions, new DialogListener() 
        @Override
        public void onComplete(Bundle values) 

        @Override
        public void onFacebookError(FacebookError error) 

        @Override
        public void onError(DialogError e) 

        @Override
        public void onCancel() 
    );

你可以看到这个here: http://developers.facebook.com/docs/guides/mobile/#android

【讨论】:

此外,如果您查看here,您会发现一种存储 facebook 会话的简单方法。然后你可以在你facebook.authorize之前检查SessionStore.restore(facebook,this)(如果它是真的,用户已经登录,如果错误授权将提示他们登录) 谢谢,这是一个好方法,但我的服务器处理 facebook 授权。 facebook 登录后,我的服务器返回一个会话 id,我使用了这个 id 和设备 id,将它们结合起来用于安全和其他重要的东西。【参考方案2】:

在将 facebook 注册与我自己的注册集成时,我实际上遇到了类似的问题(但我不是 android 开发人员)。 我在这里问了这个问题Facebook registration flow from Android 但我不知道网络视图。这似乎是一个很好的解决方案,我可以通过聊天或其他方式与您联系吗?

编辑: Facebook刚刚更新了他们的登录程序: https://developers.facebook.com/docs/offline-access-deprecation/ 如您所见,现在您从 SSO 获得的令牌(或任何其他客户端令牌)仅链接到您的应用程序(有一个验证令牌-应用程序 ID-应用程序密钥)。 端点现在是

https://graph.facebook.com/oauth/access_token?             
client_id=APP_ID&
client_secret=APP_SECRET&
grant_type=fb_exchange_token&
fb_exchange_token=EXISTING_ACCESS_TOKEN 

所以使用 facebook sdk for android 的步骤是: 1)让用户签名 2)将令牌发送到服务器 3) 服务器将根据其 app id 和 app secret 验证令牌 4) 添加您自己的安全功能

【讨论】:

以上是关于Android Webview Facebook 登录的主要内容,如果未能解决你的问题,请参考以下文章

使 facebook 登录与 Android Webview 一起工作

Android Webview Facebook 登录

Facebook Like 按钮的 Android WebView

Facebook Android API 和 Twitter Webview 登录集成

Android Facebook 应用程序在 fb webview 中打开链接,我无法登录自己的网络应用程序

由于默认浏览器,Android 无法在 web 视图中实现 facebook 评论