parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

G_Z 07.12.2017 21:46 / 07.12.2017 22:46

Если есть идеи как это можно масштабировать или сделать универсальный метод проверки и декодирования
Про масштабирование не совсем понятно.
А проверка и декодирование — тривиальные.

В спецификации, вроде, есть какие-то тонкости с именами полей тела, под это можно дорабатывать.
@main[]
$secret[secret]

$payload[
	$.a[1]
	$.b[2]
]

$token[^jwt:encode[$payload;$secret]]

encoded:
<pre>$token</pre>

decoded:
<pre>^json:string[^jwt:decode[$token;$secret];$.indent(true)]</pre>

# ---------

$payload[
	$.c[3]
	$.d[4]
]

$jwt[^jwt::create[$secret]]
$token[^jwt.encode[$payload]]

encoded:
<pre>$token</pre>

decoded:
<pre>^json:string[^jwt.decode[$token];$.indent(true)]</pre>



@CLASS
jwt


@OPTIONS
locals


@create[secret]
$self.secret[$secret]


@encode[payload;secret]
$header[^json:string[
	$.alg[HS256]
	$.typ[JWT]
]]
$header[^self.to_url_safe[^header.base64[]]]

$payload[^json:string[$payload]]
$payload[^self.to_url_safe[^payload.base64[]]]

$signature[^self.sign[$header;$payload;$secret]]

$result[${header}.${payload}.$signature]


@sign[header;payload;secret]
^if(!def $secret){
	$secret[$self.secret]
}

$result[^self.to_url_safe[^math:digest[sha256;${header}.$payload][
	$.format[base64]
	$.hmac[$secret]
]]]


@decode[token;secret]
$result[]

$token[^token.split[.;h]]

$header[$token.0]
$payload[$token.1]
$signature[$token.2]

^if(^self.sign[$header;$payload;$secret] eq $signature){
	$result[^json:parse[^taint[as-is;^string:base64[^self.from_url_safe[$payload]]]]]
}


@to_url_safe[result]
$replace[^table::create[nameless]{
^#0A
+	-
/	_}]

$result[^result.replace[$replace]]


@from_url_safe[result]
$replace[^table::create[nameless]{
-	+
_	/}]

$result[^result.replace[$replace]]