安卓:Facebook的PublishPermissions无需重新键入密码(使用SUP preSS_SSO时)?密码、PublishPermissions、Facebook、SUP

2023-09-04 04:30:58 作者:就你瞎逼逼

行动这个Android应用程序的流量 -

在UserX登记在Facebook 在UserX授予read_permissions 在UserX授予publish_permissions 在他的access_token被存储在数据库中。

UserX注销

UserY寄存器... [遵循相同的步骤]

由于它需要多个用户登录,我需要SUP preSS_SSO(感谢How禁用单点登录Facebook的Andr​​oid应用?)。

现在在Facebook的API 3.0,Facebook已经取得了ReadPermissions和PublishPermissions不同。 我成功地要求这两个权限,但它要求用户登录两次(因为SSO是燮pressed,显示的WebView) - 登录的WebView弹出再次 - 用户拥有就摆在他的电子邮件和密码。 我要访问的PublishPermissions,或ReadPermissions(以任意顺序),而不必重新输入自己的密码。

从Java code相关的功能如下所示:

 私有静态最后的名单,其中,字符串> PERMISSIONS = Arrays.asList(user_photos,read_friendlists,电子邮件,publish_actions,publish_stream);


私人无效的UpdateView(){
    会话会话= Session.getActiveSession();
    如果(session.isOpened()){
        handleAnnounce();
        textInstructionsOrLink.setText(ACKNOWLEDGE_USER);
        buttonLoginLogout.setText(R.string.logout);
        buttonLoginLogout.setOnClickListener(新OnClickListener(){
            公共无效的onClick(视图查看){
               onClickLogout();
            }
        });
    } 其他 {
        textInstructionsOrLink.setText(R.string.login);
        buttonLoginLogout.setText(R.string.login);
        buttonLoginLogout.setOnClickListener(新OnClickListener(){
            公共无效的onClick(视图查看){
                onClickLogin();
            }
        });
    }
}

私人无效onClickLogin(){
    会话会话= Session.getActiveSession();
    如果(session.isOpened()及!&安培;!session.isClosed()){
        Session.OpenRequest openRequest =新Session.OpenRequest(本).setCallback(statusCallback);
        名单<字符串> readPermissions = Arrays.asList(user_photos,电子邮件,read_friendlists);
        openRequest.setPermissions(readPermissions);
        openRequest.setLoginBehavior(SessionLoginBehavior.SUP preSS_SSO);
        session.openForRead(openRequest);
    } 其他 {
        Session.openActiveSession(这一点,真,statusCallback);
    }
}


私人无效requestPublishPermissions(会话的会话){
    Log.d(LOG_TAG,请求发布权限......);
    如果(会话!= NULL){
        名单<字符串> publishPermissions = Arrays.asList(publish_actions,publish_stream);
        最终诠释REAUTH_ACTIVITY_ code = 100;
        Session.NewPermissionsRequest reauthRequest =新Session.NewPermissionsRequest(这一点,publishPermissions).setRequest code(REAUTH_ACTIVITY_ code);
        reauthRequest.setLoginBehavior(SessionLoginBehavior.SUP preSS_SSO);
        session.requestNewPublishPermissions(reauthRequest);
    }
}

私人无效handleAnnounce(){
    会话会话= Session.getActiveSession();
    如果(会话== NULL ||!session.isOpened()){
        返回;
    }

    名单<字符串>权限= session.getPermissions();
    如果(!permissions.containsAll(权限)){
        requestPublishPermissions(会议);
        返回;
    }
}
 

解决方案 facebook安卓下载最新版

您code似乎是美好的,它是一个API的缺陷最近报道:

的https://developers.facebook.com/bugs/268146283318403?browse=search_51235ada57ba59615000124

只是耐心,我已经得到了同样的错误,我们所能做的就是等待一个固定的API。

The flow of action on this android app is -

UserX registers on facebook UserX grants read_permissions UserX grants publish_permissions His access_token is stored in our database.

UserX logs out

UserY registers ... [follows same steps]

Since it requires login of multiple users I need to SUPPRESS_SSO (thanks to How to disable Single SIgn On for facebook android app?).

Now in facebook API 3.0, Facebook has made ReadPermissions and PublishPermissions different. I am succesfully asking for both the permissions, but it requires the user to login twice (since SSO is suppressed and webview is displayed) - the login webview pops up once again - the user has to put in his email and password. I want to access the PublishPermissions, or the ReadPermissions (in any order) without the user having to retype his password.

Relevant functions from the java code is shown here:

private static final List<String> PERMISSIONS = Arrays.asList("user_photos", "read_friendlists", "email", "publish_actions", "publish_stream");


private void updateView() {
    Session session = Session.getActiveSession();
    if (session.isOpened()) {
        handleAnnounce();
        textInstructionsOrLink.setText(ACKNOWLEDGE_USER);
        buttonLoginLogout.setText(R.string.logout);
        buttonLoginLogout.setOnClickListener(new OnClickListener() {
            public void onClick(View view) { 
               onClickLogout(); 
            }
        });
    } else {
        textInstructionsOrLink.setText(R.string.login);
        buttonLoginLogout.setText(R.string.login);
        buttonLoginLogout.setOnClickListener(new OnClickListener() {
            public void onClick(View view) { 
                onClickLogin();
            }
        });
    }
}

private void onClickLogin() {
    Session session = Session.getActiveSession();
    if (!session.isOpened() && !session.isClosed()) {
        Session.OpenRequest openRequest = new Session.OpenRequest(this).setCallback(statusCallback);
        List<String> readPermissions = Arrays.asList("user_photos", "email", "read_friendlists");
        openRequest.setPermissions(readPermissions);
        openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
        session.openForRead(openRequest);
    } else {
        Session.openActiveSession(this, true, statusCallback);
    }
}


private void requestPublishPermissions(Session session) {
    Log.d(LOG_TAG, "Requesting Publish Permissions...");
    if (session != null) {
        List<String> publishPermissions = Arrays.asList("publish_actions", "publish_stream");
        final int REAUTH_ACTIVITY_CODE = 100;
        Session.NewPermissionsRequest reauthRequest = new Session.NewPermissionsRequest(this, publishPermissions).setRequestCode(REAUTH_ACTIVITY_CODE);
        reauthRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
        session.requestNewPublishPermissions(reauthRequest);
    }
}

private void handleAnnounce() {
    Session session = Session.getActiveSession();
    if (session == null || !session.isOpened()) {
        return;
    }

    List<String> permissions = session.getPermissions();
    if (!permissions.containsAll(PERMISSIONS)) {
        requestPublishPermissions(session);
        return;
    }
}

解决方案

Your code seems to be fine, it's an API's bug recently reported:

https://developers.facebook.com/bugs/268146283318403?browse=search_51235ada57ba59615000124

Just patience, I've got the very same error and all we can do is wait for a fixed API.