Node.js 如何使用aws amplify验证node/express中的accessToken?
我在我的前端React应用程序上使用AWS amplify进行用户身份验证。 我的React应用程序直接与amplify通信,无需任何后端(节点服务器)交互 我有一个用node/express编写的restapi。我想用amplify保护那个API 目前,我计划将访问令牌从我的react应用程序传递到我的节点服务器。但我无法找到一种方法,通过它,我可以在后端使用amplify验证这个令牌 aws amplify软件包是否提供了任何功能,我可以在其中传递访问令牌来验证它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
类似于
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将通过您的应用程序进行身份验证。听起来很明显,但万一你忘了!