I found one type in your code at line 5
This code will be works. I saved it file name with create-token.js
const { join } = require("path");
const { readFileSync } = require("fs");
const PRIVATE_KEY_PATH = join(__dirname, "./keys/private.pem");
const jws = require("jws");
const ALG = "RS256";
const privateKey = {
key: readFileSync(PRIVATE_KEY_PATH, "utf8").toString(),
passphrase: "Passphrasehere",
};
const payload = {
foo: "bar",
};
const token = jws.sign({
header: { alg: ALG },
payload,
privateKey,
});
console.log(token);
I demoed step by step.
1 Create private key by openssl.
if not install openssl in your windows, try to install it
if use linux, install from your OS
mkdir keys
openssl genrsa -out ./keys/private.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.............+++++
..............................................+++++
e is 65537 (0x010001)
2 Confirm private key is readable text
cat ./keys/private.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEApLgbA3bhsqQR1mr8rxLZvEfKcCLI0+Oo27uLdhj/Q8qWRpWa
zOJs6BcHSOQxdJr/kXgDHpW7x8Pj7g0wj+/XEtcBgHfOzzKceZRe6mDNxJ3st6i2
ZvpKKrhI5SN+Wu6W29usgqYopHLDHeUtX1QPl8kDJbqjaBPKIrzy5G0yF9XnBrZI
Tm7v13ak3vh6h8A6U/DMOVqCj6cYteQ3USAIHQoNHxHVzy8HDjPW+dVdLDDMoYBH
hLslW3UFPHqXERxSxrfoNubzX8j86iNMFHRrsp00tNDsgOihcaQYdyvgKB1XoHoU
AC2b/bYBeZaGdZJlywO9lauakc9uZ9O2zI2m1QIDAQABAoIBAF6D+ZQqUeV0eXvE
VguLUH7V3tYrT3st5cV3vtVcEJTwmPwVegbYYc9m71om/i2/hqgM6hVRq7c7svz0
eooNACciUg1KMdP4YYrt1Oy98TRBvgPAfjFmqsoKhmFc1XMN9mhfi4RIHYgHBeiQ
iVFq5audvv2WM49T06fNLb5e3eCIg8YeVNSrdaps/MD/ldxN7uM9D7ujub5dDz4/
lNQ4JQ4XhA0vD0YxMjyETiV8FZWF4P/2WYoDw29aKQ/iTUCBlHYTseh4veniUTW6
qfDjOXlccSX1+H1a/8x7BRecux+1Qissq82eZZPlLmxvWJCOrKmgSUvwcJh042j9
Yo0Meb0CgYEA1FJlrxvVaVcESS4u+0GPOCLPWlzVfhtgOdNutcB8ahs6lmAXSAEP
R5Hle8amZ81bzwVPs5Jhn2Qiz2QZdurR7siMLYpvRtIaLaj1G0WEwwV5GsyovjyM
FNHJV8iiwVQuM+ifRpXXEauKLP51xE/U1vgc+3B+Q3yp4g3JV6R09+cCgYEAxprJ
HSLG4Bjwfrx5M9HGpuvSoGL5NrwM/rw8SaRR8csguaq0da8h8aVdqXtlncQbB9KW
QnwBFSgPPbipCIyFg86gHLO7y40P0Tw9LStZKSN/pXr/BpOUCzqga9PV8HHVfUMx
oHL9OSNnlAP7mjwu+lkQ56BZUgnzoQU7lkZc4+MCgYEAyqNpUNqrr8HQ4Vcml75W
RilS5Nc9GwJdsFLOksCG/W3HWMWU8q+wOYpRDvTk1KT2Pnq/Oo82hL05S94pP4mV
muPkhYJd+aWEPpfGdqS+tLKAhsdVNVrsBuLB2vot+32wKvKVMPTJMqAZXB/vndDj
PdfHMWKH3zkXmhu2UeMvj3kCgYBN2G3sFa2OOThK9OUtApSy6MxuQV0drygI0Q9w
bhAQjmYNYHPLjRHo/cBwpgV2iV9u+YQcGy7xc/pFXxQiXbIXr+3iUjDR4EDK6qmw
AsW38koeOs+rbD0jCZ/HpAi/bl8X8jaJhYjr1IzM36LHGb/wMOkHYTqhhXURMFPi
20GdsQKBgG1ydLdS36o5/F9b3tGMEs9Pvq2pw80ESM0RPG3N+1MxgADTSk84+D6A
BCWPIRReI3i2q7PnpWR2/fz3K3CsxHf7gBRb5zhe4a7F0Pr6NwiTnGl23PmOkCnl
nKLXiZsuIUZrc3OyF061jS0glyc1kbQoE9FM27DjSOIJPfBhYiM4
-----END RSA PRIVATE KEY-----
3 Install jws
npm i jws
added 5 packages, and audited 6 packages in 1s
1 package is looking for funding
run `npm fund` for details
found 0 vulnerabilities
4 RUN program
node create-token.js
eyJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.ZKtyEveGTN_tVC-M8NqqEDv1mbN6aJcWJpf4W7xU
hEwMAD1MrHl2o_-Ob8D97WjnBpL94bqftBDZV3GtY2EqsjURg52jgrRajytQ6qStrgTQKOGEUMAbBIiW
BqLOPRS9s7CWDUX0IhYci8QSZkO34Hh9tzHBfKnlkedtjSP_9MwNKSOGCMoq7MBKQHecR_xkGVaangNt
yjvM4bQ8I_dclSvlyYn4htVvzeT6zX6Ja3D_Ny6su8vedKj9Q_ioPxcPWjA89U95M1l2WVrEs_KAl2WT
kZ4-jCxm3k9PwrrfvN2GhGduBBLA-6AuiD1W0h-R7oFTyOpOOvOfyDTRMVgd6A
5 Verify your token is correct by JSON web token
Copy from Step 4, paste it into jwt.io 's Encoded section. you can see Decoded part's payload section.
It should be matched create-token.js 's payload code at line 9.

From feedback, The algorithm is not typo. "PS256"( RSASSA-PSS signature with signature using SHA256 as the hash and MGF1-SHA256)
I can generate key and certificate and I can reproduce it but I don't know how to fix it.
openssl req -x509 -newkey rsa-pss -keyout rsassaPss-noRestrictions.key -out rsassaPss-noRestrictions.crt -nodes -pkeyopt rsa_keygen_bits:2048 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:16 -sigopt rsa_mgf1_md:sha1 -sha1
it will generate two files(certificate and private key)
rsassaPss-noRestrictions.crt rsassaPss-noRestrictions.key