如何在下一个 ts api 中验证来自 AAD 的访问令牌

问题描述 投票:0回答:0

我无法验证来自 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 的新手,任何帮助都会很棒,谢谢

typescript next.js azure-active-directory jwt access-token
© www.soinside.com 2019 - 2024. All rights reserved.