2017-06-28 35 views
1

我遇到了jwt令牌的困难,结果是因为coldfusion正在将int转换为float。我不确定问题出在哪里,或者如何解决。为什么coldfusion将这些值输出为浮点小数?

令牌时间戳和有效期:

<cfset TimeStamp = '#VAL(int(getTickCount()/1000))#' > 
<cfset Exp = '#VAL(int((getTickCount()/1000)+43200))#' > 

    <cfscript> 
     Variables.payload    = StructNew(); 
     Variables.payload[ "nbf" ]  = "#TimeStamp#"; 
     Variables.payload[ "exp" ]  = "#Exp#"; 
     Variables.result     = JWT.encode(payload, Variables.secretKey); 
    </cfscript> 

的JWT.Encode调用看起来是这样的:

<cffunction name="encode" access="public" returntype="String"> 
    <!--- ****************** Arguments ************************ ---> 
    <cfargument name="payload" type="any" required="true"> 
    <cfargument name="key" type="string" required="true"> 
    <cfargument name="algo" type="string" required="false" default="HS256"> 
    <!--- ****************** /Arguments *********************** ---> 

    <!--- define our variables here ---> 
    <cfset var currentTime = getCurrentUtcTime()> 
    <cfset var header = createObject("java", "java.util.LinkedHashMap").init() /> <!--- StructNew doesnt work because coldfusion 8 orders the keys ---> 
    <cfset var claims = createObject("java", "java.util.LinkedHashMap").init() /> <!--- StructNew doesnt work because coldfusion 8 orders the keys ---> 
    <cfset var segments = ArrayNew(1)> 

    <!--- 
     creation of first segment of our JWT: the header 
    ---> 
    <cfset header[ "typ" ] = "JWT"> 
    <cfset header[ "alg" ] = "HS256"> 
    <!--- add header an json with base64 encoding to segment array ---> 
    <cfset arrayAppend(segments, replace(toBase64(serializeJSON(header)), "=", "", "all"))> 

    <!--- 
     creation of the middle segment: the claims set 
    ---> 
    <cfset claims = Arguments.payload> 
    <!--- 
     escape forward slashes in generated JSON 
    ---> 
    <cfset claimsJson = replace( serializeJSON(claims), "/", "\/", "all")> 

    <!--- add header and json with base64 encoding (with padding REMOVED!) to segment array ---> 
    <cfset arrayAppend(segments, replace(toBase64(claimsJson), "=", "", "all"))> 

    <!--- 
     create the last segment: the signature 
    ---> 
    <cfset signingInput = ArrayToList(segments, ".")> 
    <cfset signature = sign(signingInput, Arguments.key, Arguments.algo)> 

    <!--- 
     add signature as last the element to our string 
    ---> 
    <cfreturn ListAppend(signingInput, signature, ".")> 

</cffunction> 

通过一个base64解码器运行,我得到的东西像EXP “:1.498696809E9,” NBF “:1.498653609E9

+0

第1步 - 自卸时间戳,看看它是否是一个整数或浮点数小数。如果它看起来像科学记数法,请使用numberformat()。 –

+0

那么直到serializeJSON才有记号,如果我在那之前转储,它是数字的。 –

+0

'serializeJSON'因屠杀数字而臭名昭着。你在什么版本的CF上? – Alex

回答

0

获取Nathan Mische's JSONUtil.cfc,然后更换线

<cfset jsonTool = createobject("component","jsonutil")> 
<cfset claimsJson = replace(jsonTool.serializeJSON(claims,false,true), "/", "\/", "all")>