React Native集成Zendesk认证时Objective-C端JWT传参问题
React Native 桥接Zendesk JWT认证实现方案
Zendesk Chat的认证模式要求提供遵守Zendesk认证协议的对象,SDK需要校验/拉取token时会主动调用该对象的getToken:方法,只需要在这个方法里把从自有服务端拿到的JWT通过回调传给SDK即可。
第一步:实现自定义RCTAuthJWT类
官方给出的代码是协议模板,需要自行创建RCTAuthJWT类,让它持有外部传入的token,可以直接把这段代码放在桥接文件顶部,也可以单独新建类文件存放:
// 引入Zendesk相关头文件,根据自己集成的版本调整路径即可 #import <ZDCChat/ZDCChat.h> #import <ZendeskSDK/ZendeskSDK.h> @interface RCTAuthJWT : NSObject <ZDKJwtAuthenticator> // 新增属性存储从RN端传入的token @property (nonatomic, copy) NSString *jwtToken; @end @implementation RCTAuthJWT - (void)getToken:(void (^)(NSString * _Nullable, NSError * _Nullable))completion { // 直接把持有的token通过回调传给SDK,无错误时error参数传nil if (self.jwtToken) { completion(self.jwtToken, nil); } else { // token不存在时返回自定义错误 NSError *err = [NSError errorWithDomain:@"com.yourapp.zendesk" code:-1 userInfo:@{NSLocalizedDescriptionKey: @"JWT token不存在"}]; completion(nil, err); } } @end
如果业务需要支持token过期自动刷新,可以直接在
getToken方法内添加请求自有服务端刷新token的逻辑,拿到新token后再调用completion即可,不需要额外触发SDK其他方法。
第二步:修改RN桥接setUserIdentity方法
原有代码的问题是创建RCTAuthJWT实例后,没有把从RN端拿到的token赋值给实例,补上赋值逻辑即可正常运行:
RCT_EXPORT_METHOD(setUserIdentity: (NSDictionary *)user) { if (user[@"token"]) { NSString *jwtToken = user[@"token"]; // 给Zendesk核心SDK设置JWT身份 id<ZDKObjCIdentity> userIdentity = [[ZDKObjCJwt alloc] initWithToken:jwtToken]; [[ZDKZendesk instance] setIdentity:userIdentity]; // 初始化认证器并传入token RCTAuthJWT *authenticator = [RCTAuthJWT new]; authenticator.jwtToken = jwtToken; // 给Chat模块绑定认证器 [ZDKChat.instance setIdentityWithAuthenticator:authenticator]; } else { // 匿名模式逻辑无需改动 id<ZDKObjCIdentity> userIdentity = [[ZDKObjCAnonymous alloc] initWithName:user[@"name"] email:user[@"email"]]; [[ZDKZendesk instance] setIdentity:userIdentity]; } }
关键注意点
- 不要在
getToken:方法内写死token,必须通过属性持有从RN端传入的、自有服务端生成的有效JWT setIdentityWithAuthenticator:必须在打开Zendesk聊天界面之前调用,否则身份配置不会生效- 切换账号(匿名切认证/切换不同认证用户)时,需要先调用Zendesk登出方法清空旧身份,再重新调用
setUserIdentity传入新用户信息,避免身份串号
内容的提问来源于stack exchange,提问作者Nicks
相关产品推荐
相关产品推荐

