2013-06-12 50 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); 
    }]; 
}