2013-06-12 48 views
2

幾個星期前我開始使用iOS開發,最近我一直在試圖將社交網絡整合到一個應用程序(Facebook,Twitter,LinkedIn)中。我設法做Facebook和Twitter登錄集成,但我堅持在LinkedIn上。linkedin Oauth如何記住登錄

使用此示例進行LinkedIn集成https://github.com/synedra/LinkedIn-OAuth-Sample-Client,我可以登錄LinkedIn,但是一旦我的應用程序關閉,我必須重新登錄。

我應該怎麼做才能使應用程序記住已登錄的用戶以及我應該如何實現從我的應用程序的其他視圖中使用來自LinkedIn(社交,網絡等)的訂閱源從登錄中使用訪問令牌?

+0

我沒有使用該庫,但oauth的重要組成部分是在auth期間獲取訪問令牌並使用它來簽署後續請求。那個圖書館以某種方式這樣做。在那裏應該有一個顯着的訪問令牌getter和setter。一旦你發現,在第一次認證之後,在下一次應用程序啓動時,在設備上堅持令牌,讀取該值並重新設置。 – danh

+0

我應該如何在設備上堅持令牌?以某種方式使用NSUserDefaults? – user2282749

+0

這是一種方式,或文件系統或鑰匙串服務(https://developer.apple.com/library/ios/#documentation/security/conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html%23//apple_ref/doc/ uid/TP30000897-CH208-SW1) – danh

回答

0

當用戶登錄到應用程序時,您應該通過LinkedIn API請求訪問令牌。之後,您使用NSUserDefaults來保存此訪問令牌。因此,當用戶打開應用程序時,您會檢查accesstoken是否存在。如果accesstoken存在,用戶已經登錄到應用程序。

- (void)getAccessToken:(NSString *)authorizationCode success:(void (^)(NSDictionary *))success failure:(void (^)(NSError *))failure 
{ 
    NSString *accessTokenUrl = @"/uas/oauth2/accessToken?grant_type=authorization_code&code=%@&redirect_uri=%@&client_id=%@&client_secret=%@"; 
    NSString *url = [NSString stringWithFormat:accessTokenUrl, authorizationCode, [self.application.redirectURL LIAEncode], self.application.clientId, self.application.clientSecret]; 

    [self POST:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSString *accessToken = [responseObject objectForKey:@"access_token"]; 
    NSTimeInterval expiration = [[responseObject objectForKey:@"expires_in"] doubleValue]; 

    // store credentials 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

    [userDefaults setObject:accessToken forKey:LINKEDIN_TOKEN_KEY]; 
    [userDefaults setDouble:expiration forKey:LINKEDIN_EXPIRATION_KEY]; 
    [userDefaults setDouble:[[NSDate date] timeIntervalSince1970] forKey:LINKEDIN_CREATION_KEY]; 
    [userDefaults synchronize]; 

    success(responseObject); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     failure(error); 
    }]; 
}