16

私のアプリでは、Facebook のセッション情報 (トークンと有効期限) をサーバーに渡して認証 (ログイン) しようとしています。

アプリサーバーへのログインシーケンスは次のとおりです。

  1. アクティブな Facebook セッションを取得します。
  2. セッションが有効な場合は、トークンを取得してサーバーに送信します。

そしてコードで:

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()戻ってくるのですか?別のプロパティを確認する必要がありますか? これは Facebook の SDK のバグですか?trueaccessToken

編集:
これを Facebook に報告しました: https://developers.facebook.com/bugs/121924628017965

4

3 に答える 3

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){

    }
}
于 2013-09-07T05:53:29.500 に答える
1

Facebook SDK がブードゥー教の魔法のようであることを除けば、認証フローで私が行っていないことがいくつかあります。ここでは、コード スニペットが 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
                }
            }
        }
    }
于 2013-06-26T05:48:54.197 に答える
0

私は問題を解決しました。問題はキーハッシュにありました。

このチュートリアルに従ってください

ステップ番号に進みます。4 サンプルを実行します。

最後に、トラブルシューティングのセクションが見つかります。これが解決策です。

ありがとう! https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/

于 2013-06-20T10:19:11.613 に答える