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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容