有時候我們有這樣的需求瘫絮,登錄后從服務(wù)器獲取到了token,但是如何判斷token是否過期填硕,如果過期了就提示用戶重新登錄呢麦萤。(當(dāng)然這件事也可以交給服務(wù)器來做)
token長這樣
一個服務(wù)器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