Session.isOpened()== true但Session.getAccessToken()==“”

时间:2013-06-17 06:59:09

标签: android facebook android-facebook

在我的应用中,我正在尝试通过将Facebook会话信息(令牌和到期日期)传递到我的服务器来进行身份验证(登录)。

我对应用服务器的登录顺序如下:

  1. 获取有效的facebook会话。
  2. 如果会话有效,请获取令牌并将其发送到服务器。
  3. 在代码中:

    Session session = Session.getActiveSession();
    if(session != null && session.isOpened() && !didLogin) {
        didLogin = true;
        String token = session.getAccessToken();
        Date expires = session.getExpirationDate();
        loginWithFacebookSession(token, expires);
    }
    

    我注意到,突然间,经过几个月的工作就好了,发送到服务器的信息有时无效,特别是token是一个空字符串而expires是无效的日期。

    在浏览了Facebook SDK(版本3.0.1)之后,我发现了可能是我的错误的基础:

    private static final Date MIN_DATE = new Date(Long.MIN_VALUE);
    private static final Date ALREADY_EXPIRED_EXPIRATION_TIME = MIN_DATE;
    private static final Date DEFAULT_LAST_REFRESH_TIME = new Date();
    
    static AccessToken createEmptyToken(List<String> permissions) {
        return new AccessToken("", ALREADY_EXPIRED_EXPIRATION_TIME, permissions, AccessTokenSource.NONE,
                DEFAULT_LAST_REFRESH_TIME);
    }
    

    这意味着在此过程中,Facebook SDK正在创建一个空令牌并使用SessionState.Category.OPENED_CATEGORY返回它。

    为什么session.isOpened()返回true实际上没有accessToken信息?我应该检查不同的房产吗?这是Facebook的SDK中的错误吗?

    编辑:
    已向Facebook报告:https://developers.facebook.com/bugs/121924628017965

3 个答案:

答案 0 :(得分:2)

使用此方法并检查您的哈希值是否正确

public void getHashKeyForFacebook(Activity activity, String packageName){
    try{
        PackageInfo info = activity.getPackageManager().getPackageInfo(packageName,  PackageManager.GET_SIGNATURES);

        for (Signature signature : info.signatures){
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (Exception ex){

    }
}

答案 1 :(得分:1)

除了Facebook SDK就像巫毒魔法之外,你有一些事我在auth流程中没有这样做。我假设你的代码片段不在Session.StatusCallback调用函数中。无论如何,我总是在从回调访问令牌之前打开会话以进行读取。在返回之前,这个请求只会给用户带来加载微调器几毫秒的不便。如果用户已从其Facebook设置页面删除了权限,它也会有所帮助。

我的身份验证流程是这样的:

private void startFbAuth() {
    Session session = Session.getActiveSession();
    if (session == null) {
        session = new Session(getApplicationContext());
        Session.setActiveSession(session);

        Session.OpenRequest openReadRequest = new Session.OpenRequest(this);
        openReadRequest.setPermissions(Arrays.asList({ "email" }));
        openReadRequest.setCallback(statusCallback);

        Session.NewPermissionsRequest permissionReadRequest = new Session.NewPermissionsRequest(this, Arrays.asList(EMAIL_PERMISSIONS));
        permissionReadRequest.setCallback(statusCallback);

        if (!session.isOpened() && !session.isClosed()) {
            session.openForRead(openReadRequest);
        } else {
            session.requestNewReadPermissions(permissionReadRequest);
        }
    }

    private Session.StatusCallback statusCallback = new SessionStatusCallback();

    private class SessionStatusCallback implements Session.StatusCallback {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if (session.isClosed()) {
                session.closeAndClearTokenInformation();
                Session.setActiveSession(null);
                SessionStore.clearFacebookInformation(Activity.this);
                // Either throw an error or try reconnecting by calling startFbAuth
            }
            if (exception != null) {
                session.closeAndClearTokenInformation();
                Session.setActiveSession(session);
                // Either throw an error or try reconnecting by calling startFbAuth
            } else {
                if (session.isOpened()) {
                    String token = session.getAccessToken();
                    // It shouldn't be null or empty here
                }
            }
        }
    }

答案 2 :(得分:0)

我解决了这个问题。问题出在关键的哈希。

遵循本教程

转到步骤号。 4运行样本。

最后你会找到故障排除部分,这就是解决方案。

谢谢! https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/