我正在使用AWS amplify在我的前端React应用程序上进行用户身份验证。我的React应用程序直接与amplify通信,无需任何后端(节点服务器)交互。
我有一个用node/express编写的REST API。我想用amplify保护那个API。
目前,我计划将访问令牌从我的反应应用传递到我的节点服务器。但是我无法找到一种方法,通过它我可以验证这个令牌在后端使用放大。
aws amplify package是否提供了任何功能,我可以在其中传递访问令牌来验证它?
比如Auth。验证令牌(
不幸的是,aws放大SDK不提供这种功能。出于这个原因,我创建了一个npm包来处理它。
该软件包公开了:
authenticate
:一种快速中间件,可以添加到任何需要针对Cognito用户池进行身份验证的路由中
authenticationError
:一个快速错误处理程序,负责处理由authenticate
中间件生成的任何身份验证错误
JWTValidator
:一个可以实例化以验证Cognito发布的JWT的类。如果需要自定义身份验证和错误处理逻辑,这将非常有用。authenticate
中间件在内部使用它
// 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;
有关更高级的用例,请查看此处的文档。
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
不幸的是,在官方的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和一个标记在后面-重定向。 多谢帮忙。
我有一个快速服务器运行,以启用用户身份验证使用护照。我在运行快速URL时获取用户信息,但我无法使用axios从我的反应应用程序中获取用户对象。我的反应应用程序说网络错误。 我试着用 快速应用程序。js(以) 我的express应用程序在端口3000上运行,因此我可以在访问时看到用户对象http://localhost:3000/user 但是当我试图在我的反应应用程序中访问这个时,我收到了网络错误
我正在尝试使用Vue和Laravel构建一个应用程序。我目前在Laravel中使用passport身份验证进行用户身份验证。但是,当我尝试使用axio从vue组件发出post请求时,即使我当前已登录,也会获得401未经授权的权限。 下面是一些示例代码: 1.从vue组件获取请求 2.拉维路 3.与上述get请求关联的日历控制器 我花了好几个小时研究这个问题,但我发现的一切都不起作用。因此,任何帮助