我无法验证来自 AAD 的访问令牌,即使它是有效的。令牌来自 Flutter 客户端,获取访问令牌的所有必要步骤都已完成。我只是无法从我的 api 验证令牌。
我想做的是使用 https://login.microsoftonline.com/my-tenantID/discovery/keys?appid=my-appID 中的公钥验证令牌,但它不起作用。我也尝试使用我的 client_secret 作为公钥,但我得到了相同的结果。我的第一个目标是验证令牌的签名,然后我将继续检查令牌的其他部分。这是我的代码。
import jwt, { decode, VerifyOptions } from 'jsonwebtoken';
import jwksClient from 'jwks-rsa';
const JWK_PROVIDER_URL = 'https://login.microsoftonline.com/<my-tenantID>/discovery/keys?appid=<my-appID>';
const client = jwksClient({
jwksUri: JWK_PROVIDER_URL,
});
export default async function isValidToken(token: string) {
const keys = await client.getKeys() as any[];
const decodedToken = jwt.decode(token, { complete: true }) as any;
const kid = decodedToken.header?.kid;
const publicKey= keys.find(k => k.kid === kid).x5c[0];
const verifyOptions: VerifyOptions = {
ignoreExpiration: true,
ignoreNotBefore: true,
algorithms: ['RS256']
};
try {
jwt.verify(token, publicKey, verifyOptions );
console.log("nice");
return true;
} catch (err) {
console.log("bad token");
return false;
}
}
这是我的终点:
export default async function controller(req: NextApiRequest, res: NextApiResponse) {
try {
const a= await isValidToken(req.headers.authorization?.replace("Bearer ", "") as string);
const { method } = req;
const handler = handlers[method as keyof typeof handlers](req, res);
return handler! || res.status(405).end(`Method ${method} Not Allowed`);
} catch (err: any) {
return res.status(500).send(err.stack)
}
}
我是一名学生,我是 next 的新手,任何帮助都会很棒,谢谢