Facebook登录是否适合需要静默登录的用例?

时间:2019-05-31 12:41:13

标签: android facebook facebook-login

当前,我们有一个需要静默登录的用例。

在我们的应用中,我们倾向于提供自动后台同步到云存储功能。

用户只需要处理一次UI登录。在其余时间里,他不再需要处理UI即可再次明确登录。

Android应用程序后台进程将为他执行静默登录,获取访问令牌,然后将“访问令牌+云文件”发送到云存储服务器以进行身份​​验证和云文件存储。

我们计划使用第三方登录机制,例如 Google登录 Facebook登录,以便用户无需执行新帐户创建步骤。

由于Google提供了静默登录功能,因此这种机制对于Google登录非常有效。

执行Google静默登录的Android应用

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

有关登录的弹出式UI的代码如下所示。但是,如果访问令牌过期,在没有弹出UI的情况下进行静默登录怎么办?

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")
    );
}

有什么方法可以避免像时间流逝这样的UI登录吗?或者,我们应该得出结论,认为Facebook登录不适用于需要静默登录的用例?

谢谢。

0 个答案:

没有答案