2015-09-13 1 views
0

Я пытаюсь создать поток входа в Facebook для своего веб-приложения Vaadin 7.Как получить статус входа в Facebook в Vaadin 7 на загрузке страницы?

Когда кто-то посещает веб-сайт, я хотел бы:

  1. Определить, является ли посетитель в настоящее время вошли в Facebook, и если да, то получить его Facebook идентификатор пользователя

  2. Если я найду счет в базе данных для этого идентификатора пользователя Facebook выполните бесшумный вход и перенаправление на какую-то стартовую страницу.

См. Также documentation about Facebook login status.

Обновление: У меня теперь все работает, за исключением того, что я до сих пор не знаю, как выполнять javascript автоматически, когда страница загружается/отображается.

@JavaScript("https://connect.facebook.net/en_US/all.js") 
public class AutoLoginView extends AutoLoginDesign 
{ 
    public AutoLoginView() 
    { 
    testButton.addClickListener(event -> actionTest()); 
    } 

    @Override 
    public void attach() 
    { 
    super.attach(); 
    com.vaadin.ui.JavaScript.getCurrent().addFunction("reportFacebookLoginStatusResult", new JavaScriptFunction() { 
     @Override 
     public void call(JsonArray arguments) 
     { 
     handleFacebookLoginStatusResult(arguments); 
     } 
    }); 
    } 

    private void actionTest() 
    { 
    String script = ""; 

    script += "FB.init({"; 
    script += " appId : '<my-app-id>',"; 
    script += " status : true,"; 
    script += " xfbml : false,"; 
    script += " version : 'v2.4'"; 
    script += "});"; 

    script += "FB.getLoginStatus(function(response) {"; 
    script += " if (response.status === 'connected') {"; 
    script += " reportFacebookLoginStatusResult(response.status, response.authResponse.userID, response.authResponse.accessToken);"; 
    script += " } else {"; 
    script += " reportFacebookLoginStatusResult(response.status, null, null);"; 
    script += " }"; 
    script += "});"; 

    com.vaadin.ui.JavaScript.getCurrent().execute(script); 
    } 

    private void handleFacebookLoginStatusResult(JsonArray arguments) 
    { 
    LOGGER.log(Level.INFO, "status: '" + arguments.get(0).asString() + "'"); 
    LOGGER.log(Level.INFO, "userID: '" + arguments.get(1).asString() + "'"); 
    LOGGER.log(Level.INFO, "accessToken: '" + arguments.get(2).asString() + "'"); 
    } 
} 

В настоящее время я использую кнопку прослушивания кнопки, чтобы выполнить javascript. Но как я могу выполнить это автоматически при загрузке страницы?

ответ

0

Я наконец-то выяснил решение, в котором участвовало письмо custom javascript component. Я также пытался добиться этого с помощью CustomLayout, но никогда не выполнял вызовы javascript в facebook.

Класс AutoLoginView:

public class AutoLoginView extends VerticalLayout 
{ 
    public AutoLoginView() 
    { 
    addComponent(new AutoLoginComponent()); 
    } 
} 

AutoLoginComponent класс:

@JavaScript({ "https://connect.facebook.net/en_US/all.js", "AutoLoginComponent-connector-v3.js" }) 
public class AutoLoginComponent extends AbstractJavaScriptComponent 
{ 
    public AutoLoginComponent() 
    { 
    addFunction("reportLoginStatusInfo", new JavaScriptFunction() { 
     @Override 
     public void call(final JsonArray arguments) throws JsonException 
     { 
     handleLoginStatusInfo(arguments); 
     } 
    }); 
    } 

    private void handleLoginStatusInfo(JsonArray arguments) 
    { 
    String status= arguments.get(0).asString(); 

    if ("connected".equals(status)) 
    { 
     String user_id = arguments.get(1).asString(); 
     String access_code = arguments.get(2).asString(); 
    } 
    } 
} 

В AutoLoginComponent-разъем-v3.js (здесь вам придется настроить имя пакета и приложение ID):

window.package_AutoLoginComponent = function() 
{ 
    FB.init(
    { 
     appId  : '<your-app-id>', 
     status  : true, 
     xfbml  : false, 
     version : 'v2.4' 
    }); 

    var connector = this; 

    FB.getLoginStatus(function(response) 
    { 
     if (response.status === 'connected') 
     { 
      connector.reportLoginStatusInfo(response.status, response.authResponse.userID, response.authResponse.accessToken); 
     } 
     else 
     { 
      connector.reportLoginStatusInfo(response.status, null, null); 
     } 
    }); 
};