0

だから私は最近 iOS 開発を始めたばかりで、PodioKitライブラリを使用して Podio とやり取りしています。電子メールとパスワードを使用してサーバーで認証した後、OAuth トークンを返します。これには、必要なデータ、リフレッシュ トークンなどが含まれます。

ユーザーがアプリの使用間でログインし続けるために、OAuth トークンはキーチェーンに保存され、アプリの起動時に再度アクセスされることになっています。JNKeychainを使用してそれらをキーチェーンに格納してきましたが、問題なく動作しているようです。ただし、キーチェーンからトークンを取得すると、データは同じではありません。つまり、何かをしようとすると、PodioKit が「リフレッシュ トークンが見つかりません」というエラーをスローします。これらの NSLog 出力の違いを確認できます。

キーチェーンに保存する前に:

2014-01-23 15:40:38.069 PodioKPITest[377:60b] oauthToken: <PKOAuth2Token: 0x16d59390>
2014-01-23 15:40:38.071 PodioKPITest[377:60b] oauthToken.refData: {
    id = 1883826;
    type = user;
}
2014-01-23 15:40:38.072 PodioKPITest[377:60b] oauthToken.refreshToken: d9a59577e0574d20bdbc739ccfcf61ce
2014-01-23 15:40:38.073 PodioKPITest[377:60b] oauthToken.accessToken: 53909cabac874fb78fcca7eda87a4e84
2014-01-23 15:40:38.079 PodioKPITest[377:60b] oauthToken.expiresOn: 2014-01-23 12:40:38 +0000
2014-01-23 15:40:38.080 PodioKPITest[377:60b] oauthToken.transferToken: (null)

キーチェーンからロードした後:

2014-01-23 15:41:00.509 PodioKPITest[389:60b] oauthToken: <PKOAuth2Token: 0x14d42cb0>
2014-01-23 15:41:00.512 PodioKPITest[389:60b] oauthToken.refData: (null)
2014-01-23 15:41:00.514 PodioKPITest[389:60b] oauthToken.refreshToken: (null)
2014-01-23 15:41:00.516 PodioKPITest[389:60b] oauthToken.accessToken: (null)
2014-01-23 15:41:00.521 PodioKPITest[389:60b] oauthToken.expiresOn: 2014-01-23 04:40:38 +0000
2014-01-23 15:41:00.523 PodioKPITest[389:60b] oauthToken.transferToken: (null)

なぜこれが起こっているのか誰にも分かりますか?キーチェーンよりもトークンを保存するのに適した/より正しい場所はありますか? うまくいけば、私は自分自身をうまく説明しました!

4

1 に答える 1

0

はい、トークンは暗号化されるため、キーチェーンはトークンを格納するのに適した場所です。

Podio と JNKeychain で行ったのとまったく同じことを試してみましたが、うまくいきました。どのバージョンの PodioKit と JNKeychain を使用していますか? あなたのケースでは、アーカイブ解除がこれらのプロパティ値の復元に失敗しているようです。

PKOAuth2Token *token = [[PKOAuth2Token alloc] initWithAccessToken:@"access1234"
                                                     refreshToken:@"refresh1234"
                                                    transferToken:@"transfer1234"
                                                        expiresOn:[NSDate dateWithTimeIntervalSinceNow:3600]
                                                          refData:@{@"ref": @"somedata"}];

// Test archiving
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:token];
PKOAuth2Token *archivedToken = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"Restored access token from archive %@", archivedToken.accessToken);

// Test keychain
NSString *keychainKey = @"AuthToken";
[JNKeychain saveValue:token forKey:keychainKey];
PKOAuth2Token *keychainToken = [JNKeychain loadValueForKey:keychainKey];
NSLog(@"Restored access token from keychain: %@", keychainToken.accessToken);

上記のプリント:

2014-01-23 21:07:22.719 App[17202:70b] Restored access token from archive access1234
2014-01-23 21:07:22.723 App[17202:70b] Restored access token from keychain: access1234

FXKeychainのような別のキーチェーン ラッパー ライブラリをいつでも試すことができます。

于 2014-01-23T20:11:42.077 に答える