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
第1步 - 自卸时间戳,看看它是否是一个整数或浮点数小数。如果它看起来像科学记数法,请使用numberformat()。 –
那么直到serializeJSON才有记号,如果我在那之前转储,它是数字的。 –
'serializeJSON'因屠杀数字而臭名昭着。你在什么版本的CF上? – Alex