如何在Android上为Codename One启用Facebook身份验证

如何在Android上为Codename One启用Facebook身份验证,facebook,authentication,codenameone,Facebook,Authentication,Codenameone,我已经为此挣扎了几个小时。以下是我采取的步骤: 使用主包com.recipes.auth和主类FacebookAuth 为android创建facebook应用程序,将包名设置为com.recipes.auth,并将主类名设置为FacebookAuthSub 然后,生成散列并粘贴它。使用以下方法创建哈希: keytool-exportcert-alias(你的密钥库别名)-密钥库(到你的密钥库的路径)| openssl sha1-二进制| openssl base64 在Codename

我已经为此挣扎了几个小时。以下是我采取的步骤:

  • 使用主包
    com.recipes.auth
    和主类
    FacebookAuth

  • 为android创建facebook应用程序,将包名设置为
    com.recipes.auth
    ,并将主类名设置为
    FacebookAuthSub

  • 然后,生成散列并粘贴它。使用以下方法创建哈希:

    keytool-exportcert-alias(你的密钥库别名)-密钥库(到你的密钥库的路径)| openssl sha1-二进制| openssl base64

  • 在Codename One facebook.appId中添加构建提示

  • 在主窗体中编写以下代码:

    String clientId = "xxxxx";
    String redirectURI = "{server}/auth/facebook";
    String clientSecret = "xxx";
    Login fb = FacebookConnect.getInstance();
    fb.setClientId(clientId);
    fb.setRedirectURI(redirectURI);
    fb.setClientSecret(clientSecret);
    //Sets a LoginCallback listener
    fb.setCallback(new LoginCallback() {
        @Override
        public void loginSuccessful() {
            ConnectionRequest connectionRequest = new ConnectionRequest();
            connectionRequest.setPost(false);
            connectionRequest.setUrl(
                    "{server}/auth/facebook/callback?access_token="
            + fb.getAccessToken().getToken());
            connectionRequest.addResponseListener(event -> {
                Log.p(new String(connectionRequest.getResponseData()));
            });
            NetworkManager.getInstance().addToQueue(connectionRequest);
        }
    
        @Override
        public void loginFailed(String errorMessage) {
            Dialog.show("No!", "it did not work!", "sad", null);
        }
    });
    
    Form hi = new Form("Hi World");
    Button loginWithFacebook = new Button("Fb Auth");
    loginWithFacebook.addActionListener(event -> {
        //trigger the login if not already logged in
        if(!fb.isUserLoggedIn()){
            fb.doLogin();
        }else{
            //get the token and now you can query the facebook API
            String token = fb.getAccessToken().getToken();
        }
    });
    hi.add(loginWithFacebook);
    hi.show();
    
    其中{server}是我的服务器的uri。我的服务器的身份验证路径是
    {server}/auth/facebook
    ,回调URL是
    {server}/auth/facebook/callback
    ,成功重定向是
    {server}/api/Users/me

  • 将web客户端添加到Facebook应用程序,以启用模拟器

  • 在产品中的facebook应用程序页面上,添加产品,然后添加facebook登录,并在有效的OAuth重定向URI中输入我的服务器

  • 现在,当我尝试从设备,我得到一个关于无效哈希错误

    在其中一个答案中,有人认为这可能是因为

  • 如果您从其他设备(PC)构建apk,Android密钥哈希将发生变化

    事实上这是正确的,因为我使用的是代码名One cloud builds。我遵循以下指南: ,
    找不到答案。但是如何使用我自己的服务器设置与Facebook身份验证相关的所有内容?我正在寻找一种简单、循序渐进的方法,这种方法确实有效。

    不要相信你在stackoverflow上读到的所有东西

    不同的计算机将产生相同的SHA1,否则加密和数字签名将无法工作


    为了确保我在Mac和Linux机器上尝试了这个方法,得到了完全相同的结果。Facebook在SHA1上是脆弱的,JVM的差异(JCA安装等)可能会导致一些问题。我们有时会连接设备以从错误日志中获取实际的SHA1值,但一旦获得正确的值,即使使用多台服务器构建,它们也不会改变。

    不要相信stackoverflow上读到的所有内容

    不同的计算机将产生相同的SHA1,否则加密和数字签名将无法工作

    为了确保我在Mac和Linux机器上尝试了这个方法,得到了完全相同的结果。Facebook在SHA1上是脆弱的,JVM的差异(JCA安装等)可能会导致一些问题。我们有时会连接设备以从错误日志中获取实际的SHA1值,但一旦获得正确的值,即使使用多个服务器构建,它们也不会改变