当前,我们有一个需要静默登录的用例。
在我们的应用中,我们倾向于提供自动后台同步到云存储功能。
用户只需要处理一次UI登录。在其余时间里,他不再需要处理UI即可再次明确登录。
Android应用程序后台进程将为他执行静默登录,获取访问令牌,然后将“访问令牌+云文件”发送到云存储服务器以进行身份验证和云文件存储。
我们计划使用第三方登录机制,例如 Google登录, Facebook登录,以便用户无需执行新帐户创建步骤。
由于Google提供了静默登录功能,因此这种机制对于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的访问令牌不再有效。我需要向用户弹出此用户界面,以便执行自动后台同步到云存储?
有关登录的弹出式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登录不适用于需要静默登录的用例?
谢谢。