【问题标题】:codename one FB authentication代号一FB认证
【发布时间】:2017-10-12 05:10:00
【问题描述】:

我一直在使用下面的代码

String clientId = "1171134366245722";
String redirectURI = "http://www.codenameone.com/";
String clientSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
Login fb = FacebookConnect.getInstance();
fb.setClientId(clientId);
fb.setRedirectURI(redirectURI);
fb.setClientSecret(clientSecret);
//Sets a LoginCallback listener
fb.setCallback(...);
//trigger the login if not already logged in
if(!fb.isUserLoggedIn()){
    fb.doLogin();
} else {
    //get the token and now you can query the facebook 
    String token = fb.getAccessToken().getToken();
    ...
}

登录facebook账户后,它直接将我带到代码中指定的sendRedirectURI(XXX),并且回调函数不起作用。我需要运行setcallback(),我该如何实现?

【问题讨论】:

    标签: facebook codenameone


    【解决方案1】:

    要使 Facebook 登录正常工作,您需要做几件事。

    您需要定义要获取的数据类型。最好的方法是创建一个 UserData 接口并在你的类中实现它:

    public interface UserData {
    
        public String getId();
    
        public String getEmail();
    
        public String getFirstName();
    
        public String getLastName();
    
        public String getImage();
    
        public void fetchData(String token, Runnable callback);
    }
    

    然后像这样实现它:

    class FacebookData implements UserData {
    
        String id;
        String email;
        String first_name;
        String last_name;
        String image;
    
        @Override
        public String getId() {
            return id;
        }
    
        @Override
        public String getEmail() {
            return email;
        }
    
        @Override
        public String getFirstName() {
            return first_name;
        }
    
        @Override
        public String getLastName() {
            return last_name;
        }
    
        @Override
        public String getImage() {
            return image;
        }
    
        @Override
        public void fetchData(String token, Runnable callback) {
            ConnectionRequest req = new ConnectionRequest() {
                @Override
                protected void readResponse(InputStream input) throws IOException {
                    try {
                        JSONParser parser = new JSONParser();
                        Map<String, Object> parsed = parser.parseJSON(new InputStreamReader(input, "UTF-8"));
                        id = (String) parsed.get("id");
                        email = (String) parsed.get("email");
                        first_name = (String) parsed.get("first_name");
                        last_name = (String) parsed.get("last_name");
                        image = (String) ((Map) ((Map) parsed.get("picture")).get("data")).get("url").toString();
                    } catch (Exception ex) {
                    }
                }
    
                @Override
                protected void postResponse() {
                    callback.run();
                }
    
                @Override
                protected void handleErrorResponseCode(int code, String message) {
                    if (code >= 400 && code <= 410) {
                        doLogin(FacebookConnect.getInstance(), FacebookData.this, true);
                        return;
                    }
                    super.handleErrorResponseCode(code, message);
                }
            };
            req.setPost(false);
            req.setUrl("https://graph.facebook.com/v2.10/me");
            req.addArgumentNoEncoding("access_token", token);
            req.addArgumentNoEncoding("fields", "id,email,first_name,last_name,picture.width(512).height(512)");
            NetworkManager.getInstance().addToQueue(req);
        }
    }
    

    让我们创建一个包含setCallback()doLogin() 方法

    void doLogin(Login lg, UserData data, boolean forceLogin) {
        if (!forceLogin) {
            if (lg.isUserLoggedIn()) {
                //process Facebook login with "data" here
                return;
            }
    
            String token = Preferences.get("token", (String) null);
    
            if (getToolbar() != null && token != null) {
                long tokenExpires = Preferences.get("tokenExpires", (long) -1);
                if (tokenExpires < 0 || tokenExpires > System.currentTimeMillis()) {
                    data.fetchData(token, () -> {
                        //process Facebook login with "data" here
                    });
                    return;
                }
            }
        }
    
        lg.setCallback(new LoginCallback() {
            @Override
            public void loginFailed(String errorMessage) {
                Dialog.show("Error Logging In", "There was an error logging in with Facebook: " + errorMessage, "Ok", null);
            }
    
            @Override
            public void loginSuccessful() {
                data.fetchData(lg.getAccessToken().getToken(), () -> {
                    Preferences.set("token", lg.getAccessToken().getToken());
                    Preferences.set("tokenExpires", tokenExpirationInMillis(lg.getAccessToken()));
                    //process Facebook login with "data" here
                });
            }
        });
        lg.doLogin();
    }
    
    long tokenExpirationInMillis(AccessToken token) {
        String expires = token.getExpires();
        if (expires != null && expires.length() > 0) {
            try {
                long l = (long) (Float.parseFloat(expires) * 1000);
                return System.currentTimeMillis() + l;
            } catch (NumberFormatException ex) {
            }
        }
        return -1;
    }
    

    最后,在fb.setClientSecret()之后调用doLogin()

    String clientId = "1171134366245722";
    String redirectURI = "http://www.codenameone.com/";
    String clientSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
    Login fb = FacebookConnect.getInstance();
    fb.setClientId(clientId);
    fb.setRedirectURI(redirectURI);
    fb.setClientSecret(clientSecret);
    doLogin(fb, new FacebookData(), false);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      相关资源
      最近更新 更多