- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经从 Facebook 为我们的应用程序删除了 20 多个权限,但在我的生活中,我无法获得 Facebook OAuth Dialog 请求以反射(reflect)新的减少权限列表。它继续请求比我请求的更多权限,无论我传入什么。
我已经尝试使用我之前在 Facebook 上与我们的应用程序关联的帐户,并且我已经尝试使用全新的测试帐户(通过 Facebook 开发者网站创建,没有预先授权)。我试过在我的设备上卸载 Facebook 应用程序和我们的应用程序,我尝试过几种不同的设备。
我正在尝试使用 Facebook Android SDK(3.0 之前的版本)对用户进行授权,但我也尝试绕过它并使用我们的服务器端身份验证流程,并且在任何一种情况下它都会显示旧列表。
我已经搜索了我们的整个代码库、客户端和服务器,在某个地方可能 Conceal 了权限,但它们无处可寻。我已经在 Facebook SDK 中打开了调试和打印语句,并且可以确认它实际上正在接收我对 .authorize() 方法的更新权限列表,并且它正在尝试在 FbDialog 中加载移动 url(当我使用正确的权限列表卸载 facebook 应用程序)。但是,它显示的权限包括我已经删除的所有权限。
我什至尝试过将权限添加到我们之前在 Facebook 开发者网站上的空白权限列表中以获取 App Center 列表,尽管我认为这与 OAuth Dialog 无关。
这也应该与 Facebook SDK 3.0+ 首先只执行读取权限的方法无关,也与 Facecbook OAuth Dialog 将权限分解为多个页面这一事实无关。我的问题是它请求的权限比我想要的更多,而不是更少。
具体来说,它请求的内容如下:
笔记、事件、家乡、宗教和政治观点、关系、关系兴趣、聊天状态、 friend 关系、关系兴趣、笔记、聊天状态、事件、家乡、宗教和政治观点
但我已经删除了所有这些权限。我什至尝试过只请求 user_photos 权限,但它继续在 OAuth 对话框中显示一长串列表。
有没有人遇到过这个问题?卸载 facebook 和您的应用程序时是否有一些设备缓存未被删除?
我知道 Facebook 应用程序开发人员网站中曾经有更多设置,用于列出经过身份验证的推荐的权限等,这些设置是否有可能以某种方式保留在幕后,即使它们不再可访问?
这是 Android Facebook SDK(3.0 之前)中 FbDialog 类的完整日志,我只请求“user_photos”,但显示了以下对话框:
D/Facebook-WebView( 5622): Webview loading URL: https://m.facebook.com/dialog/oauth?display=touch&client_id=xxxx&scope=user_photos&type=user_agent&redirect_uri=fbconnect%3A%2F%2Fsuccess
D/Facebook-WebView( 5622): Redirect URL: http://m.facebook.com/login.php?skip_api_login=1&api_key=xxxx&signed_next=1&next=https%3A%2F%2Fm.facebook.com%2Fdialog%2Foauth%3Fredirect_uri%3Dfbconnect%253A%252F%252Fsuccess%26display%3Dtouch%26scope%3Duser_photos%26type%3Duser_agent%26client_id%3Dxxxx%26ret%3Dlogin&cancel_uri=fbconnect%3A%2F%2Fsuccess%3Ferror%3Daccess_denied%26error_code%3D200%26error_description%3DPermissions%2Berror%26error_reason%3Duser_denied&display=touch&_rdr
D/Facebook-WebView( 5622): Webview loading URL: http://m.facebook.com/login.php?skip_api_login=1&api_key=xxxx&signed_next=1&next=https%3A%2F%2Fm.facebook.com%2Fdialog%2Foauth%3Fredirect_uri%3Dfbconnect%253A%252F%252Fsuccess%26display%3Dtouch%26scope%3Duser_photos%26type%3Duser_agent%26client_id%3Dxxxx%26ret%3Dlogin&cancel_uri=fbconnect%3A%2F%2Fsuccess%3Ferror%3Daccess_denied%26error_code%3D200%26error_description%3DPermissions%2Berror%26error_reason%3Duser_denied&display=touch&_rdr
D/Facebook-WebView( 5622): Webview onPageFinished: http://m.facebook.com/login.php?skip_api_login=1&api_key=xxxx&signed_next=1&next=https%3A%2F%2Fm.facebook.com%2Fdialog%2Foauth%3Fredirect_uri%3Dfbconnect%253A%252F%252Fsuccess%26display%3Dtouch%26scope%3Duser_photos%26type%3Duser_agent%26client_id%3Dxxxx%26ret%3Dlogin&cancel_uri=fbconnect%3A%2F%2Fsuccess%3Ferror%3Daccess_denied%26error_code%3D200%26error_description%3DPermissions%2Berror%26error_reason%3Duser_denied&display=touch&_rdr
D/Facebook-WebView( 5622): Webview loading URL: http://m.facebook.com/login.php?skip_api_login=1&api_key=xxxx&signed_next=1&next=https%3A%2F%2Fm.facebook.com%2Fdialog%2Foauth%3Fredirect_uri%3Dfbconnect%253A%252F%252Fsuccess%26display%3Dtouch%26scope%3Duser_photos%26type%3Duser_agent%26client_id%3Dxxxx%26ret%3Dlogin&cancel_uri=fbconnect%3A%2F%2Fsuccess%3Ferror%3Daccess_denied%26error_code%3D200%26error_description%3DPermissions%2Berror%26error_reason%3Duser_denied&display=touch&_rdr
D/Facebook-WebView( 5622): Webview onPageFinished: http://m.facebook.com/login.php?skip_api_login=1&api_key=xxxx&signed_next=1&next=https%3A%2F%2Fm.facebook.com%2Fdialog%2Foauth%3Fredirect_uri%3Dfbconnect%253A%252F%252Fsuccess%26display%3Dtouch%26scope%3Duser_photos%26type%3Duser_agent%26client_id%3Dxxxx%26ret%3Dlogin&cancel_uri=fbconnect%3A%2F%2Fsuccess%3Ferror%3Daccess_denied%26error_code%3D200%26error_description%3DPermissions%2Berror%26error_reason%3Duser_denied&display=touch&_rdr
D/Facebook-WebView( 5622): Webview loading URL: https://m.facebook.com/login.php?skip_api_login=1&signed_next=1&next=https%3A%2F%2Fm.facebook.com%2Fdialog%2Foauth%3Fredirect_uri%3Dfbconnect%253A%252F%252Fsuccess%26display%3Dtouch%26scope%3Duser_photos%26type%3Duser_agent%26client_id%3Dxxxx%26ret%3Dlogin&refsrc=http%3A%2F%2Fm.facebook.com%2Flogin.php&app_id=42701128600&refid=9
D/Facebook-WebView( 5622): Redirect URL: https://m.facebook.com/dialog/oauth?redirect_uri=fbconnect%3A%2F%2Fsuccess&display=touch&scope=user_photos&type=user_agent&client_id=xxxx&ret=login&ext=1372379560&hash=AeZmYhdN1rISiaNZ&refid=9&_rdr
D/Facebook-WebView( 5622): Webview loading URL: https://m.facebook.com/dialog/oauth?redirect_uri=fbconnect%3A%2F%2Fsuccess&display=touch&scope=user_photos&type=user_agent&client_id=xxxx&ret=login&ext=1372379560&hash=AeZmYhdN1rISiaNZ&refid=9&_rdr
D/Facebook-WebView( 5622): Webview onPageFinished: https://m.facebook.com/dialog/oauth?redirect_uri=fbconnect%3A%2F%2Fsuccess&display=touch&scope=user_photos&type=user_agent&client_id=xxxx&ret=login&ext=1372379560&hash=AeZmYhdN1rISiaNZ&refid=9&_rdr
更新(添加代码):
下面我列出了我们的完整权限集,但在上面的日志示例中,我将除“user_photos”之外的所有内容都注释掉了。请求Facebook授权的部分本质上是:
public final class MyFacebook {
private static MyFacebook mInstance = null;
private static Facebook mFBInstance = null;
private String[] mPermissions = null;
private Handler mHandler = null;
public static MyFacebook getInstance() {
if(mInstance == null) {
mInstance = new MyFacebook();
}
return mInstance;
}
public Facebook getFBInstance() {
if(mFBInstance == null) {
mFBInstance = new Facebook("<my facebook app id>");
SessionStore.restore(mFBInstance, MyApplication.getContext());
SessionEvents.addAuthListener(new FacebookAuthListener());
SessionEvents.addLogoutListener(new FacebookLogoutListener());
}
return mFBInstance;
}
private MyFacebook () {
mHandler = new Handler();
}
public String[] getPermissionsList() {
if(mPermissions == null) {
int i = 0;
mPermissions = new String[42];
mPermissions[i++] = "user_about_me";
mPermissions[i++] = "user_activities";
mPermissions[i++] = "user_birthday";
mPermissions[i++] = "user_education_history";
mPermissions[i++] = "user_groups";
mPermissions[i++] = "user_interests";
mPermissions[i++] = "user_likes";
mPermissions[i++] = "user_location";
mPermissions[i++] = "user_photos";
mPermissions[i++] = "user_status";
mPermissions[i++] = "user_videos";
mPermissions[i++] = "user_website";
mPermissions[i++] = "user_work_history";
mPermissions[i++] = "email";
mPermissions[i++] = "read_friendlists";
mPermissions[i++] = "read_mailbox";
mPermissions[i++] = "read_requests";
mPermissions[i++] = "read_stream";
mPermissions[i++] = "user_checkins";
mPermissions[i++] = "friends_about_me";
mPermissions[i++] = "friends_activities";
mPermissions[i++] = "friends_birthday";
mPermissions[i++] = "friends_education_history";
mPermissions[i++] = "friends_groups";
mPermissions[i++] = "friends_interests";
mPermissions[i++] = "friends_likes";
mPermissions[i++] = "friends_location";
mPermissions[i++] = "friends_photos";
mPermissions[i++] = "friends_status";
mPermissions[i++] = "friends_videos";
mPermissions[i++] = "friends_website";
mPermissions[i++] = "friends_work_history";
mPermissions[i++] = "friends_checkins";
mPermissions[i++] = "publish_stream";
mPermissions[i++] = "manage_notifications";
mPermissions[i++] = "publish_actions";
mPermissions[i++] = "user_actions.music";
mPermissions[i++] = "user_actions.news";
mPermissions[i++] = "user_actions.video";
mPermissions[i++] = "friends_actions.music";
mPermissions[i++] = "friends_actions.news";
mPermissions[i++] = "friends_actions.video";
}
return mPermissions;
}
public void logout() {
SessionEvents.onLogoutBegin();
AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(getInstance().getFBInstance());
asyncRunner.logout(MyApplication.getContext(), new LogoutRequestListener());
}
public static class FacebookAuthListener implements AuthListener {
public void onAuthSucceed() {
Log.d("FB", "onAuthSucceed: ");
SessionStore.save(getInstance().getFBInstance(), MyApplication.getContext());
Log.d("FB", "Finished Saving in onAuthSucceed");
}
public void onAuthFail(String error) {
Log.e("FB", error);
}
}
public static class FacebookLogoutListener implements LogoutListener {
public void onLogoutBegin() {
}
public void onLogoutFinish() {
// remove our stored session
SessionStore.clear(MyApplication.getContext());
}
}
private class LogoutRequestListener extends BaseRequestListener {
public void onComplete(String response, final Object state) {
// callback should be run in the original thread,
// not the background thread
mHandler.post(new Runnable() {
public void run() {
SessionEvents.onLogoutFinish();
}
});
}
}
以及用法:
@JavascriptInterface
public void clientAddAccount(final int network) {
AccountManageActivity.this.runOnUiThread(new Runnable(){
@Override
public void run() {
MyFacebook.getInstance().getFBInstance().authorize(ThisActivity.this, MyFacebook.getInstance().getPermissionsList(),
new FBLoginDialogListener());
}
});
}
...
private final class FBLoginDialogListener implements DialogListener {
public void onComplete(Bundle values) {
Log.d("LB", "Login Success. onComplete");
SessionEvents.onLoginSuccess();
if(MyFacebook.getInstance().getFBInstance().isSessionValid()) {
// do app stuff
}
}
public void onFacebookError(FacebookError error) {
Log.d("LB", "onFacebookError: " + error.getMessage());
SessionEvents.onLoginError(error.getMessage());
// do app stuff
}
public void onError(DialogError error) {
Log.d("LB", "onError: " + error.getMessage());
SessionEvents.onLoginError(error.getMessage());
// do app stuff
}
public void onCancel() {
Log.d("LB", "onCancel");
SessionEvents.onLoginError("Action Canceled");
// do app stuff
}
}
最佳答案
原来这是因为 Facebook 方面的遗留设置与白名单应用程序的旧方法有关。
修复需要联系 Facebook 让他们删除我们开发者帐户上的那些非标准设置。这种情况很少见,只是因为我们最初是通过联系他们提出请求而被列入白名单的。
关于android - 为什么 Facebook OAuth Dialog 对我的应用程序使用过时的权限列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17355104/
我是非洲的一名学生,在我们的土地上,确实存在缓慢且昂贵的互联网连接,这就是为什么每当我们听到安装软件的“在线存储库”方法这个词时都会害怕得发抖。该死的,这通常意味着你必须去别处看看。 问题。(如果没有
我正在使用 OpenCV 1 进行一些图像处理,并且对 cvSetErrMode 函数(它是 CxCore 的一部分)感到困惑。 OpenCV 具有三种错误模式。 叶:调用错误处理程序后程序终止。 父
安装新版 IDEA.14 后,(maven)项目的部署显着增加(从 15 秒增加到 47 秒)。 最佳答案 原因: IDEA 使用 捆绑 Maven的版本 解决方案:设置 (ctrl+alt+S) -
在 .NET 中,您可以将某些方法标记为过时,以便开发人员在尝试使用已弃用的方法时收到警报。 Private Sub FormerMethod() 问题是您只能在您控制的类中执行此操作。当您希望开发
一段时间以来,我一直在尝试自己解决这个问题,但一直没有成功。当我大约有 10% 的时间重新部署我的 Rails 应用程序时,就会发生这种情况。其他 90% 的时间部署顺利进行。 我试了又试,还是没成功
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在学习 HTTP/2 协议(protocol)。它是一个带有小消息帧的二进制协议(protocol)。它允许在单个 TCP 连接上进行流复用。从概念上讲,它似乎与 WebSockets 非常相似。
在 Matlabs 的最新版本中,specgram 函数被 spectrogram 取代,文档说明: Note. To obtain the same results for the removed
我们试图在构建时标记外部类型(如 ConfigurationManager)的使用。 自定义代码分析字典可以提供帮助 [1],但仅限于项目中包含源代码的情况。同样,Obsolete 属性适用于项目中包
我将 Anaconda 与 Python 3 结合使用,并尝试安装 cc 包,这是 uber h3 包的要求。 尝试通过以下方式在 anaconda 命令行中安装时: pip install cc 我
我在 Razor 中创建了一个专门用于显示货币的显示模板,现在我想在我的代码中删除它并替换为接受字符串格式(我可以将其设置为“C”)的标准文本显示模板。 然而,出现了很多次,所以我想使用类似 [Obs
我希望我的网站具有如下所示的 URL: example.com/2010/02/my-first-post 我有我的 Post带 slug 的模型字段('我的第一篇文章')和 published_on
4.7 并喜欢在 qgraphicsview 上叠加两个图像。顶部的图像应是半透明的,以便能够透过它看到。最初,两个图像都是完全不透明的。我期望存在一些为每个像素设置全局 alpha 值的函数,但似乎
总结: 我在我的 Swift 代码中犯了一个错误,我已经修复了它。然后我问自己为什么会这样,我该如何避免。我尝试了一些方法,但没有任何帮助。 我把错误和我的想法放在下面。我希望你能教我避免这种错误的正
我正在尝试重命名在 SVN 中跟踪的 Java 包。这一切似乎都有效。它将代码移动到新包等。然而,噩梦就在那时开始,乐趣就开始了,这取决于你的观点。摆脱旧包很难。 我陷入了“过时”或“不存在”消息的循
我们使用 NLog 或 Serilog 进行日志记录。我们正忙于将系统从 ASP.NET 移植到 ASP.NET Core,这 has logging built in . 理想情况下,我们希望放弃
ETag header 的定义 ( https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag ): The ETag HTTP re
我是一名优秀的程序员,十分优秀!