针对 LinkedIn API 的 OAuth 不断返回 401。是什么原因导致的?

问题描述 投票:0回答:1

我正在使用

AFNetworking
AFOAuth1Client
AFLinkedInOAuth1Client
从 LinkedIn 的 API 获取 OAuth 令牌。这一切都运作良好。

当我使用

getPath
v1/people/~
拨打电话时,我始终收到 401。

如果我将代码中的所有相同值推送到 LinkedIn 控制台,生成的链接将为我提供我想要的基本个人资料。

导致 401 的原因是什么?我有一种感觉,要么是

AFNetworking
,要么是我的配置。

此外,您对如何诊断根本问题有什么建议吗?

以下代码

+ (JJLinkedInClient *)sharedInstance {
    DEFINE_SHARED_INSTANCE_USING_BLOCK(^{
        return [[self alloc] init];
    });
}

- (id)init {
    
    if ( (self = [super init]) ) {
        _client = [[AFLinkedInOAuth1Client alloc] initWithBaseURL:[NSURL URLWithString:kJJLinkedInAPIBaseURLString]
                                                              key:@"XXXXXXXX"
                                                           secret:@"YYYYYYYY"];
        
//        [_client registerHTTPOperationClass:[AFJSONRequestOperation class]];
        [_client registerHTTPOperationClass:[AFHTTPRequestOperation class]];
//        [_client setDefaultHeader:@"Accept" value:@"application/json"];
    }
    
    return self;
}

- (void)authorize:(void(^)())success {
    
    __block JJLinkedInClient *weakSelf = self;
    
    [self.client authorizeUsingOAuthWithRequestTokenPath:@"uas/oauth/requestToken"
                                      userAuthorizationPath:@"uas/oauth/authorize"
                                                callbackURL:[NSURL URLWithString:@"XXXXXXX://linkedin-auth-success"]
                                            accessTokenPath:@"uas/oauth/accessToken"
                                               accessMethod:@"POST"
                                                    success:^(AFOAuth1Token *accessToken) {
                                                        NSLog(@"Success: %@", accessToken);
                                                        [weakSelf getProfile];
                                                        success();
                                                    } failure:^(NSError *error) {
                                                        NSLog(@"Error: %@", error);
                                                    }];
}

- (void)getProfile {
    
    [self.client getPath:@"v1/people/~"
              parameters:nil
                 success:^(AFHTTPRequestOperation *operation, id responseObject) {
                     NSLog(@"%@", responseObject);
                 }
                 failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                     NSLog(@"%@", error);
                 }];    
}
ios objective-c oauth linkedin-api afnetworking
1个回答
2
投票

问题出在 AFOAuth1Client 内部的 AFPercentEscapedQueryStringPairMemberFromStringWithEncoding 函数中。 它不需要转义波浪号,并且需要转义逗号。

由于这是一个静态函数,我认为我无法在 AFLinkedInOAuth1Client 中覆盖它。 我会跟进@mattt,看看他怎么说。 现在你可以将其更改为这样,以使其正常工作:

static NSString * AFPercentEscapedQueryStringPairMemberFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
    static NSString * const kAFCharactersToBeEscaped = @":/?&=;+!@#$(),";
    static NSString * const kAFCharactersToLeaveUnescaped = @"[].~";
//    static NSString * const kAFCharactersToBeEscaped = @":/?&=;+!@#$()~";
//    static NSString * const kAFCharactersToLeaveUnescaped = @"[].";

    return (__bridge_transfer  NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kAFCharactersToLeaveUnescaped, (__bridge CFStringRef)kAFCharactersToBeEscaped, CFStringConvertNSStringEncodingToEncoding(encoding));
}
© www.soinside.com 2019 - 2024. All rights reserved.