首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Session.isOpened() == true但Session.getAccessToken() == "“

Session.isOpened() == true但Session.getAccessToken() == "“
EN

Stack Overflow用户
提问于 2013-06-17 14:59:09
回答 3查看 2.6K关注 0票数 16

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

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

  1. 获取活动的facebook会话。
  2. 如果会话有效,则获取令牌并将其发送到服务器。

在代码中:

代码语言:javascript
复制
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)之后,我发现了可能是我的错误的基础:

代码语言:javascript
复制
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中的一个bug吗?

编辑:

向Facebook报告了这一点:https://developers.facebook.com/bugs/121924628017965

EN

回答 3

Stack Overflow用户

发布于 2013-09-07 13:53:30

使用此方法并检查散列是否正确

代码语言:javascript
复制
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){

    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-06-26 13:48:54

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

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

代码语言:javascript
复制
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
                }
            }
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2013-06-20 18:19:12

我解决了这个问题。问题出在key Hash中。

按照本教程进行操作

转到第4步,运行示例。

最后,您将看到故障排除部分,这就是解决方案。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17141955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档