我想将Firebase REST API与自定义数据库身份验证令牌一起使用。 我从console.firebase.google.com的项目设置中获取了数据库密钥。根据该页面,此秘密可用于使用旧版Firebase令牌生成器创建自定义数据库身份验证令牌。" 所以我在https://www.firebase.com/docs/rest/guide/user-auth.html下做了他们所说的"在没有助手库的情况下生成令牌"在https://jwt.io/introduction/:
header='{"alg":"HS256","typ":"JWT"}'
claims='{"v":0,"iat":1465114351,"exp":1465117951,"d":{"uid":"test"}}'
b64header=`echo -n $header | base64 -w 0`
b64claims=`echo -n $claims | base64 -w 0`
echo -n "$b64header.$b64claims."
echo -n "$b64header.$b64claims" | openssl sha256 -binary -hmac $SECRET | base64 -w 0
以这种方式生成的令牌可以正常工作( 200 OK ):
curl -v -o output.json -D output.txt "$URL/test.json?auth=$TOKEN"
但是当我改变JWT声明中的时间戳时,
claims='{"v":0,"iat":1465114158,"exp":1465117758,"d":{"uid":"test"}}'
我收到 400 Bad Request {{#34;错误" :" 无法验证MAC。"}而是。
我注意到了:
但即使我对" auth"进行了网址编码。参数,
curl -v -o output.json -D output.txt -G --data-urlencode "auth=$TOKEN" "$URL/test.json"
它仍然以同样的方式失败。
我做错了什么?
答案 0 :(得分:0)
您的base64编码错误,您需要使用base64url,/
使用+
而_
代替-
。填充也被剥离。结果与最终对整个字符串进行url编码非常不同。
header='{"alg":"HS256","typ":"JWT"}'
claims='{"v":0,"iat":1465114158,"exp":1465117758,"d":{"uid":"test"}}'
b64header=`echo -n $header | base64 -w 0 | tr -d '=' | tr '/+' '_-'`
b64claims=`echo -n $claims | base64 -w 0 | tr -d '=' | tr '/+' '_-'`
echo -n "$b64header.$b64claims."
echo -n "$b64header.$b64claims" | openssl sha256 -binary -hmac $SECRET | base64 -w 0 | tr -d '=' | tr '/+' '_-'
JWT spec定义编码如下:
使用URL和文件名安全字符集的Base64编码 在RFC 4648的第5节中定义,所有尾随' =' 省略字符(如第3.2节所允许)并且没有 包含任何换行符,空格或其他附加内容 字符。