Node.js 如何使用aws amplify验证node/express中的accessToken?

Node.js 如何使用aws amplify验证node/express中的accessToken?,node.js,reactjs,amazon-web-services,amazon-cognito,aws-amplify,Node.js,Reactjs,Amazon Web Services,Amazon Cognito,Aws Amplify,我在我的前端React应用程序上使用AWS amplify进行用户身份验证。 我的React应用程序直接与amplify通信,无需任何后端(节点服务器)交互 我有一个用node/express编写的restapi。我想用amplify保护那个API 目前,我计划将访问令牌从我的react应用程序传递到我的节点服务器。但我无法找到一种方法,通过它,我可以在后端使用amplify验证这个令牌 aws amplify软件包是否提供了任何功能,我可以在其中传递访问令牌来验证它 类似于Auth.verif

我在我的前端React应用程序上使用AWS amplify进行用户身份验证。 我的React应用程序直接与amplify通信,无需任何后端(节点服务器)交互

我有一个用node/express编写的restapi。我想用amplify保护那个API

目前,我计划将访问令牌从我的react应用程序传递到我的节点服务器。但我无法找到一种方法,通过它,我可以在后端使用amplify验证这个令牌

aws amplify软件包是否提供了任何功能,我可以在其中传递访问令牌来验证它


类似于
Auth.verifyToken()

不幸的是,官方aws amplify SDK中没有此类方法。 在做了大量研究之后,我不得不为此编写自己的中间件。这并不像看上去那么困难,但唯一困难的部分是从庞大的AWS文档中收集正确的信息

我已经编写了这个中间件来实现同样的功能,希望这能有所帮助

import axios from 'axios'
import awsconfig from '../../aws-exports';

const COGNITO_URL = `https://cognito-idp.${awsconfig.aws_project_region}.amazonaws.com/`;

const authentication = async (req, res, next) => {
    try {
        const accessToken = req.headers.authorization.split(" ")[1];

        const { data } = await axios.post(
            COGNITO_URL,
            {
                AccessToken: accessToken
            },
            {
                headers: {
                    "Content-Type": "application/x-amz-json-1.1",
                    "X-Amz-Target": "AWSCognitoIdentityProviderService.GetUser"
                }
            }
        )

        req.user = data;
        next();
    } catch (error) {
        return res.status(401).json({
            message: 'Auth failed'
        });
    }
};

export default authentication;
该中间件获取授权头并使用AWS Cognito REST API验证传入的accessToken

为了在前端获得accessToken,您可以执行以下操作:

const { accessToken: { jwtToken } } = await Auth.currentSession();

这个
jwtToken
是您的accessToken,您可以在
Authorization
头中发送它,然后使用我编写的中间件在后端进行验证。

AWS实际上已经很好地记录了这一点。我编写了一个中间件的要点,该中间件用于在我的express.js服务器中验证AWS Cognito令牌

本质上,当您在Amazon中创建用户池时,AWS会创建一个JSON Web密钥(JWK)。JWT包含一个公钥,可用于验证JWT的签名

在Javascript的高层:

const jwt = getJwtFromHeader(request);
const jwk = getJwkFromAWS();

// convert a jwk to a PEM for use by OpenSSL or crypto
const pem = jwkToPem(jwk);
// verify the signature of the token using the public key from AWS
await jwt.verify(authToken, pem, {algorithms: ['RS256']}, (err, decoded) =>{
  console.log('decoded', decoded);
  // TODO -- verify claims from decoded token
}); 
完整的express.js实现的要点:

AWS资源:


重要提示:对于阅读本文的任何人,请记住验证“iss”声明和“exp”声明!如果您不检查“iss”声明,任何拥有AWS帐户的人都可以创建一个用户池并发布JWTs,该JWTs将通过您的应用程序进行身份验证。听起来很明显,但万一你忘了!