无法将令牌附加到 API 调用(基本身份验证、AFNetworking)

Posted

技术标签:

【中文标题】无法将令牌附加到 API 调用(基本身份验证、AFNetworking)【英文标题】:Unable to attach token to API calls (Basic Authentication, AFNetworking) 【发布时间】:2013-11-02 01:23:36 【问题描述】:

我在我的项目中使用基本身份验证。要获取令牌,我发送一个获取请求,获取令牌对象,将其存储为 NSUserDefault,我需要将此令牌附加到我的所有 API 调用(当然除了登录)。

在 AFNetworking/RestKit 中使用令牌进行 API 调用的正确方法是什么?

这是我的令牌对象的样子:

response.body="Id":"84f4faf2","TokenValidity":"1.00:00:00","ValidTo":"2013-11-02T04:24:00.0817221Z","Parameters":"AccountId":"1041","Token":"sF6G3czrqZmm70FtDKZxDoNC21tglUvo1+HqraqQU/Y="

为了获取令牌,我将 AFHTTPClient 子类化并按照堆栈溢出问题 Using AFNetworking and HTTP Basic Authentication 中所述进行令牌调用。

目前我将响应正文存储到 id 响应对象,设置从该对象创建 NSUserDefault 并尝试调用它。

这就是我获得令牌的方式

SBAPIManager.h

#import "AFHTTPClient.h"
#import <AFNetworking/AFHTTPClient.h>

@interface SBAPIManager : AFHTTPClient
-(void)setUsername:(NSString *)username andPassword:(NSString *)password;
- (void)setAuthorizationHeaderWithToken:(NSString *)token;
+(SBAPIManager *)sharedManager;

@end

SBAPIManager.m

#import "SBAPIManager.h"
#import "AFNetworking/AFJSONRequestOperation.h"
#import "AFNetworking/AFNetworkActivityIndicatorManager.h"

@implementation SBAPIManager
#pragma mark - Methods
-(void)setUsername:(NSString *)username andPassword:(NSString *)password

    [self clearAuthorizationHeader];
    [self setAuthorizationHeaderWithUsername:username password:password];


-(void)setAuthorizationHeaderWithToken:(NSString *)token

    [self setAuthorizationHeaderWithToken:token];


#pragma mark - initialization
-(id)initWithBaseURL:(NSURL *)url

    self = [super initWithBaseURL:url];
    if (!self)
        return nil;
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
        [self setDefaultHeader:@"Accept" value:@"application/json"];
        [self setParameterEncoding:AFJSONParameterEncoding];
        [[AFNetworkActivityIndicatorManager sharedManager]setEnabled:YES];

    return self;


#pragma mark - singleton methods
+(SBAPIManager *)sharedManager

    static dispatch_once_t pred;
    static SBAPIManager *_sharedManager =nil;

    dispatch_once(&pred, ^_sharedManager =[[self alloc]initWithBaseURL:[NSURL URLWithString:@"https://qstage.azurewebsites.net"]]; );
    return _sharedManager;


@end

ViewController.m

        [[SBAPIManager sharedManager]setUsername:_nickname andPassword:_StoreIdentifierForVendor];

        [[SBAPIManager sharedManager]getPath:@"/Accounts/Token" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 

            NSUserDefaults *TokenSession = [NSUserDefaults standardUserDefaults ];
            [TokenSession setObject:responseObject forKey:@"TOKEN"];

            NSLog(@"JSON");
            NSLog(@"token %@",[self Token]);
         failure:^(AFHTTPRequestOperation *operation,NSError *error) 
            //Error stuff here
        ];

     failure:nil];

创建 TokenSession 对象后,我对 TokenSession 进行Base64 编码,并在进行 API 调用之前将其与 setAuthorizationHeaderWithToken 方法一起使用。但我得到一个[__NSCFDictionary dataUsingEncoding:]: unrecognized selector sent to instance 错误。因此,在我尝试解决此问题之前,如果有人能告诉我,我的做法是否是进行 API 调用的正确方式,我将不胜感激。

【问题讨论】:

【参考方案1】:

您接收并存储到用户默认值中的responseObject 是一个字典(因为您已将 AFNetworking 配置为自动为您反序列化 JSON)。因此,当您将其用作字符串时,您会遇到异常。

您要么需要完成下载以获取 JSON 字符串,要么需要在尝试使用之前将字典 (NSJSONSerialization) 重新序列化为字符串。

【讨论】:

以上是关于无法将令牌附加到 API 调用(基本身份验证、AFNetworking)的主要内容,如果未能解决你的问题,请参考以下文章

无法根据访问令牌对用户进行身份验证 - MS Graph API C#

Swagger UI 将身份验证令牌传递给标头中的 API 调用

使用 JwtAuthForWebAPI 的 Web APi2 身份验证不接受 JWT 令牌

在javascript和axios中为来自前端的每个api调用发送firebase身份验证令牌

如何正确地将身份验证令牌放在 GET 请求的标头中

AWS Api 网关:缺少身份验证令牌