2017-06-28 3 views
1

Je rencontre des difficultés avec un jeton jwt, car c'est parce que coldfusion convertit un int en float. Je ne suis pas sûr où le problème est ou comment le réparer.Pourquoi coldfusion génère-t-il ces valeurs sous forme de nombres décimaux à virgule flottante?

horodatage Token et l'expiration:

<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> 

L'appel JWT.Encode ressemble à ceci:

<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> 

Run via un décodeur base64, je reçois quelque chose comme exp ": 1.498696809E9," FBN « : 1.498653609E9

+0

Étape 1 - timestamp décharge et voir si elle est un nombre entier ou décimal à virgule flottante. Si cela ressemble à une notation scientifique, utilisez numberformat(). –

+0

Eh bien, il n'a pas la notation jusqu'à la serializeJSON, si je vider avant, c'est numérique. –

+0

'serializeJSON' est connu pour les nombres de boucherie. Quelle version de CF vous êtes? – Alex

Répondre

0

Obtenez Nathan Mische's JSONUtil.cfc remplacez ensuite la ligne

.

avec

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