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 一起工作
Facebook Like 按钮的 Android WebView
Facebook Android API 和 Twitter Webview 登录集成