当前位置: 首页 > 知识库问答 >
问题:

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

池砚文
2023-03-14

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

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

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

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

比如Auth。验证令牌(


共有3个答案

束新
2023-03-14

不幸的是,aws放大SDK不提供这种功能。出于这个原因,我创建了一个npm包来处理它。

该软件包公开了:

  • authenticate:一种快速中间件,可以添加到任何需要针对Cognito用户池进行身份验证的路由中
  • authenticationError:一个快速错误处理程序,负责处理由authenticate中间件生成的任何身份验证错误
  • JWTValidator:一个可以实例化以验证Cognito发布的JWT的类。如果需要自定义身份验证和错误处理逻辑,这将非常有用。authenticate中间件在内部使用它
  • JWT签名验证。
  • JWT声称核实。
  • 验证令牌没有过期。
  • 验证受众(aud)声明与配置中提供的有效受众之一匹配。
  • 验证发行者(iss)声明对配置的用户池有效。
  • 验证token_use声明是否与配置中提供的有效令牌使用之一相匹配。
  • 根据JWT签名键旋转线程中的描述支持JWKs旋转。
  • 无需创建用户池即可设置本地测试的自定义pem。
// app.js
'use strict';

const express = require('express');
const { authenticate, authenticationError } = require('aws-cognito-express');

const app = express();

// Add the authentication middleware.
app.use(authenticate({
  region: 'us-east-2',
  userPoolId: 'us-east-2_6IfDT7ZUq',
  tokenUse: ['id', 'access'],
  audience: ['55plsi2cl0o267lfusmgaf67pf']
}));

// Protected route.
app.get('/articles', (req, res, next) => {
  console.log('JWT payload: ', req.cognito);
});

// Add the authentication error handler.
app.use(authenticationError());

module.exports = app;

有关更高级的用例,请查看此处的文档。

越心水
2023-03-14

AWS实际上已经很好地记录了这一点。我已经写了一篇关于我在express中验证AWS Cognito令牌的中间件的概要。js服务器。

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

在Javascript的高级别:

import jwt from "jsonwebtoken";

const authToken = getJwtFromHeader(request);

// please remember to verify the "iss" claim and "exp" claim!
validateAuthToken(authToken);

// convert a jwk to a PEM for use by OpenSSL or crypto
const jwk = getJwkFromAWS();
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
}); 

我的要点是完整的表达。js实现:https://gist.github.com/fourgates/92dc769468497863168417c3524e24dd

AWS资源:

https://github.com/awslabs/aws-support-tools/tree/master/Cognito/decode-verify-jwthttps://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html

山越
2023-03-14

不幸的是,在官方的aws-放大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。

为了在您的前端获得访问令牌,您可以这样做:

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

这个jwtToken是你的访问令牌,你可以在你的Authoration报头中发送它,然后在后端使用我写的中间件验证它。

 类似资料:
  • 问题内容: 用Express v3实现基本的HTTP身份验证似乎很简单: 不过,第4版(我使用的是4.2)删除了中间件,所以我有点卡住了。我有以下代码,但是它不会导致浏览器提示用户输入凭据,这就是我想要的(以及我想象的旧方法所做的): 问题答案: 我使用原始代码查找答案:

  • 问题内容: 我已经通过使用nodejs + express制作了简单的nodejs应用程序。现在,我要进行用户身份验证。我想通过使用猫鼬来实现会话处理。你能举个例子吗? 问题答案: 一些有用的链接: 如何在node.js中实现登录身份验证 在node.js和mongodb中创建注册和登录表单 另外,会话管理不是由Mongoose完成,而是由connect-mongodb或connect- redi

  • 问题内容: 在我的应用程序中,我需要使用express框架设置cookie。我已经尝试了以下代码,但没有设置cookie。 谁能帮我做到这一点? 问题答案: 在Express中使用中间件的顺序很重要:先前声明的中间件将首先被调用,并且如果它可以处理请求,则稍后声明的任何中间件都不会被调用。 如果正在处理请求,则需要向上移动中间件: 此外,中间件需求 要么 端的请求(通过发回的响应),或请求传递到下

  • 我们使用Paypal Express作为结账,使用Omnipay php库。现在买家输入密码并同意在paypal站点上付款后,他会被返回到首页的成功页面。 我现在想知道,我如何才能验证支付真的是成功的?手动调用成功页面并不是很难实现虚假的成功支付... 我得到一个付款ID和一个标记在后面-重定向。 多谢帮忙。

  • 问题内容: 我正在尝试按照https://stackoverflow.com/a/18633827/2063561的说明进行操作,但是仍然无法加载styles.css。 从app.js 在我的.ejs文件中,我尝试了这两行 都不加载css。我进入开发人员的控制台,注意到类型设置为’text / html’而不是’text / css’。 我的路看起来像 问题答案: 在server.js文件中使用它

  • 我正在尝试使用Vue和Laravel构建一个应用程序。我目前在Laravel中使用passport身份验证进行用户身份验证。但是,当我尝试使用axio从vue组件发出post请求时,即使我当前已登录,也会获得401未经授权的权限。 下面是一些示例代码: 1.从vue组件获取请求 2.拉维路 3.与上述get请求关联的日历控制器 我花了好几个小时研究这个问题,但我发现的一切都不起作用。因此,任何帮助