iOS客户端解析服务器token

有时候我们有这样的需求,登录后从服务器获取到了token,但是如何判断token是否过期,如果过期了就提示用户重新登录呢。(当然这件事也可以交给服务器来做)

token长这样

一个服务器token长这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsib3NzLXNlcnZpY2UiLCJvcGVuYXBpLXNlcnZpY2UiXSwidXNlcl9uYW1lIjoiMTUzNDQzNTk2MTEiLCJzY29wZSI6WyJyZWFkIiwid3JpdGUiXSwiZXhwIjoxNTM5ODM1MzEwLCJhdXRob3JpdGllcyI6WyJVU0VSIl0sImp0aSI6IjlkYjNhNGE0LTEyNDItNGRlNS04OTc2LTUxY2UxYmE2YmQ0YiIsImNsaWVudF9pZCI6InRlc3QifQ.-yHx0mIfIFv82YlCnmycCRtpg9wT3KlWCygJKf5fLTo

解析后长这样

{
    aud =     (
        "oss-service",
        "openapi-service"
    );
    authorities =     (
        USER
    );
    "client_id" = test;
    exp = 1539835310;
    jti = "9db3a4a4-1242-4de5-8976-51ce1ba6bd4b";
    scope =     (
        read,
        write
    );
    "user_name" = 15344359611;
}

解析代码

-(id)jwtDecodeWithJwtString:(NSString *)jwtStr {
    NSArray * segments = [jwtStr componentsSeparatedByString:@"."];
    NSString * base64String = [segments objectAtIndex:1];
    int requiredLength = (int)(4 *ceil((float)[base64String length]/4.0));
    int nbrPaddings = requiredLength - (int)[base64String length];
    if(nbrPaddings > 0){
        NSString * pading = [[NSString string] stringByPaddingToLength:nbrPaddings withString:@"=" startingAtIndex:0];
        base64String = [base64String stringByAppendingString:pading];
    }
    base64String = [base64String stringByReplacingOccurrencesOfString:@"-" withString:@"+"];
    base64String = [base64String stringByReplacingOccurrencesOfString:@"_" withString:@"/"];
    NSData * decodeData = [[NSData alloc] initWithBase64EncodedData:base64String options:0];
    NSString * decodeString = [[NSString alloc] initWithData:decodeData encoding:NSUTF8StringEncoding];
    NSDictionary * jsonDict = [NSJSONSerialization JSONObjectWithData:[decodeString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
    return jsonDict;
}

参考来源: http://popdevelop.com/2013/12/decode-json-web-token-jwt-in-ios-objective-c/

对比时间戳

-(NSString *)token {
    NSString *token = [ProjectUtil readUserDataWithKey:kLoginToken];
    DLog(@"server token %@",token);
    if (token) {
        NSDictionary *dict = [self jwtDecodeWithJwtString:token];
        DLog(@"server token dict %@",dict);
        if ([dict objectForKey:@"exp"]) {
            NSNumber *exp = [dict objectForKey:@"exp"];//时间戳
            NSTimeInterval time = exp.floatValue + 28800;//因为时差问题要加8小时 == 28800 sec
            NSDate *detaildate = [NSDate dateWithTimeIntervalSince1970:time];
            NSLog(@"server token date:%@",[detaildate description]);
            //日历
            NSCalendar *calendar = [NSCalendar currentCalendar];
            NSDate *currentDate = [NSDate date];
            //计算两个日期的差值
            NSDateComponents*cmps= [calendar components:NSCalendarUnitDay fromDate:currentDate toDate:detaildate options:NSCalendarMatchStrictly];
            NSLog(@"server token 时间差值--->%@",cmps);
            if (cmps.day <= 1) {
                //如果token过期,则清除token
                [self clearToken];
                return nil;
            }
        }
    }
    return token;
}

~~~~~ok

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值