【发布时间】:2022-07-16 18:46:02
【问题描述】:
我正在尝试使用 cloudflare worker 来执行经过身份验证的操作。
我正在使用 firebase 进行身份验证,并且可以访问通过的访问令牌,但是由于 firebase-admin 使用 nodejs 模块,它无法在平台上工作,所以我只能手动验证令牌。
我一直在尝试使用 Crypto API 进行身份验证,最后让它导入公钥签名令牌以检查其是否有效,但我一直收到 FALSE。我正在努力弄清楚为什么它总是返回 false 的有效性。
我导入的加密密钥以“秘密”类型输入,我希望它是“公开的”。
任何想法或帮助都会是巨大的。在过去的几天里,我一直在用头撞桌子,试图弄清楚这一点
这是我目前所拥有的:
function _utf8ToUint8Array(str) {
return Base64URL.parse(btoa(unescape(encodeURIComponent(str))))
}
class Base64URL {
static parse(s) {
return new Uint8Array(Array.prototype.map.call(atob(s.replace(/-/g, '+').replace(/_/g, '/').replace(/\s/g, '')), c => c.charCodeAt(0)))
}
static stringify(a) {
return btoa(String.fromCharCode.apply(0, a)).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_')
}
}
export async function verify(userToken: string) {
let jwt = decodeJWT(userToken)
var jwKey = await fetchPublicKey(jwt.header.kid);
let publicKey = await importPublicKey(jwKey);
var isValid = await verifyPublicKey(publicKey, userToken);
console.log('isValid', isValid) // RETURNS FALSE
return isValid;
}
function decodeJWT(jwtString: string): IJWT {
// @ts-ignore
const jwt: IJWT = jwtString.match(
/(?<header>[^.]+)\.(?<payload>[^.]+)\.(?<signature>[^.]+)/
).groups;
// @ts-ignore
jwt.header = JSON.parse(atob(jwt.header));
// @ts-ignore
jwt.payload = JSON.parse(atob(jwt.payload));
return jwt;
}
async function fetchPublicKey(kid: string) {
var key: any = await (await fetch('https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com')).json();
key = key[kid];
key = _utf8ToUint8Array(key)
return key;
}
function importPublicKey(jwKey) {
return crypto.subtle.importKey('raw', jwKey, { name: 'HMAC', hash: { name: 'SHA-256' } }, false, ['sign']);
}
async function verifyPublicKey(publicKey: CryptoKey, token: string) {
const tokenParts = token.split('.')
let res = await crypto.subtle.sign({ name: 'HMAC', hash: { name: 'SHA-256' } }, publicKey, _utf8ToUint8Array(tokenParts.slice(0, 2).join('.')))
return Base64URL.stringify(new Uint8Array(res)) === tokenParts[2];
}
【问题讨论】:
-
Cloudflare 工作人员确实支持 Cloudflare worker JWT 软件包。你试过用那个吗?
-
是的,不幸的是没有运气
标签: javascript firebase firebase-authentication jwt cloudflare-workers