Является ли логин Facebook подходящим для использования, когда требуется тихий вход? - PullRequest
2 голосов
/ 31 мая 2019

В настоящее время у нас есть сценарий использования, для которого требуется тихий вход.

В нашем приложении мы стремимся обеспечить автоматическую фоновую синхронизацию с облачным хранилищем .

Пользователю просто нужно иметь дело с логином единовременного интерфейса.В остальное время ему больше не нужно иметь дело с пользовательским интерфейсом для повторного входа в систему.

Фоновый процесс приложения Android выполнит для него тихий вход, получит токен доступа, затем отправит «токен доступа +облачный файл "на сервер облачного хранилища для аутентификации и облачного хранилища файлов.

Мы планируем использовать сторонний механизм входа в систему, такой как вход в Google , логин Facebook , чтобыпользователю не нужно проходить этап создания новой учетной записи.

Такой механизм работает очень хорошо для входа в Google, поскольку Google предоставляет функцию тихого входа.

Android-приложение, которое выполняет вход в Google без вывода сообщений

public static GoogleSignInClient buildGoogleSignInClient() {
    GoogleSignInOptions signInOptions =
            new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(WENOTE_CLOUD_STORAGE_CLIENT_ID)
                    .requestEmail()
                    .build();
    return GoogleSignIn.getClient(WeNoteApplication.instance(), signInOptions);
}

GoogleSignInClient googleSignInClient = buildGoogleSignInClient();
Task<GoogleSignInAccount> task = googleSignInClient.silentSignIn();
if (task.isSuccessful()) {
    GoogleSignInAccount googleSignInAccount = task.getResult();
    final String idToken = googleSignInAccount.getIdToken();

    // Send idToken to server
}

Внутренний код, который выполняет аутентификацию и принимает загруженный файл

@app.route('/upload_file', methods = ['POST'])
def upload_file():
    file = request.files['file']
    user = json.loads(request.form['user'])
    token = user['token']

    # https://developers.google.com/identity/sign-in/web/backend-auth
    try:
        # Specify the CLIENT_ID of the app that accesses the backend:
        idinfo = id_token.verify_oauth2_token(token, requests.Request(), constants.CLIENT_ID)

        # Or, if multiple clients access the backend server:
        # idinfo = id_token.verify_oauth2_token(token, requests.Request())
        # if idinfo['aud'] not in [CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]:
        #     raise ValueError('Could not verify audience.')

        if idinfo['iss'] not in ['accounts.google.com', 'https://accounts.google.com']:
            raise ValueError('Wrong issuer.')

        # If auth request is from a G Suite domain:
        # if idinfo['hd'] != GSUITE_DOMAIN_NAME:
        #     raise ValueError('Wrong hosted domain.')

        # ID token is valid. Get the user's Google Account ID from the decoded token.
        sub = idinfo['sub']

Однако мне было интересно, подходит ли когда-либо вход в Facebook для такого случая использования?Согласно

https://developers.facebook.com/docs/facebook-login/access-tokens/

Короткоживущие токены обычно имеют время жизни около часа или двух, в то время как долгоживущие токены обычно имеют срок жизни около 60 дней.

Означает ли это, что через 60 дней токен доступа из Facebook больше не действителен.Мне нужно открыть этот пользовательский интерфейс для автоматической фоновой синхронизации с облачным хранилищем?

enter image description here

Код выглядит следующим образом для входазадействован всплывающий интерфейс.Но как насчет тихого входа без всплывающего пользовательского интерфейса в случае истечения срока действия токена доступа?

private void facebook() {
    callbackManager = CallbackManager.Factory.create();

    LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            AccessToken accessToken = loginResult.getAccessToken();

            // Send accessToken to server.
        }

        @Override
        public void onCancel() {
        }

        @Override
        public void onError(FacebookException error) {
        }
    });


    LoginManager.getInstance().logInWithReadPermissions(
            this,
            Arrays.asList("email")
    );
}

Есть ли способ избежать такого входа в пользовательский интерфейс, как время?Или мы должны сделать вывод, что вход в Facebook не подходит для случая использования, когда требуется тихий вход?

Спасибо.

...