美文网首页收藏iosiOS开发iOS技术资料
ios客户端解析服务器token

ios客户端解析服务器token

作者: 面皮大师 | 来源:发表于2017-10-18 12:18 被阅读603次

有时候我们有这样的需求,登录后从服务器获取到了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

相关文章

网友评论

    本文标题:ios客户端解析服务器token

    本文链接:https://www.haomeiwen.com/subject/ifwsuxtx.html