控制台错误:TypeError:jwt.sign 不是函数
在我的 package.json 中使用 "type": "module" 尝试最新的 Node 版本 13。到目前为止一切都很顺利,直到我尝试使用“jsonwebtoken”添加令牌身份验证。不确定这是我的代码问题还是兼容性问题?使用他们的 ES 模块与我在 React 中使用的有一些不同。
创建新的令牌辅助函数
import * as jwt from 'jsonwebtoken'
export const newToken = user => {
return jwt.sign({id: user.id}, JWT_SECRET, {
expiresIn: '1d'
})
}
Run Code Online (Sandbox Code Playgroud)
注册功能
export const signup = async (req, res, next) => {
// ...
try {
//.. create user code ..
const user = new User({email, password})
user.save()
const token = newToken(user)
return res.json({token, user})
} catch (error) {
console.error(error)
res.status(500).send('Server Error') …Run Code Online (Sandbox Code Playgroud) 我正在 Node.js 和 Express 中编写 SSO 身份验证服务器,使用 JWT 进行身份验证。我一直在阅读 Auth0 等来源的文章,了解如何更好地保护我的 JWT。我已经能够包含并验证令牌上的大多数标准声明,但我想知道究竟要验证什么“iat”和“sub”声明。
对于“iat”,当令牌传递到 Express 路由并且该路由在执行任何敏感操作之前开始检查用户的身份验证状态时,提供值来验证此声明的最佳实践是什么?我最好的猜测是在验证签名之前从令牌中提取 userId,然后将其与存储在用户表中的“iat”值进行比较,但这似乎不对。
对于“sub”,使用无状态服务器,如果应用程序从经过验证的令牌本身获取其用户信息,那么应用程序应该如何知道期望并验证哪个用户的“sub”声明?
或者我对这些用例的理解不正确?该服务器的目的是为此应用程序本身以及其他应用程序内的内容提供身份验证。
我想在后端接收刷新令牌以将令牌列入黑名单。
当用户传递访问令牌request.header以调用 API 时,我正在获取访问令牌,是否有任何方法可以在用户未传递标头时获取刷新令牌。
django jwt django-rest-framework django-rest-framework-jwt django-rest-framework-simplejwt
假设我通过openid-connect成功登录后收到了令牌
http://xxxxxx/auth/realms/demo/protocol/openid-connect/token
{
"access_token": "xxxxxx",
"expires_in": 600,
"refresh_expires_in": 1800,
"refresh_token": "xxxxxx",
"token_type": "bearer",
"not-before-policy": xxxx,
"session_state": "xxxxx",
"scope": "email profile"
}
Run Code Online (Sandbox Code Playgroud)
有没有办法像https://jwt.io/那样使用 PHP解码 jwt 令牌的有效负载?谢谢。
我需要测试我的 API。例如,我有图像列表页面。我需要对此页面进行测试,但如果没有身份验证,我无法执行此操作。我用智威汤逊。我不知道怎么做。请帮帮我。
测试.py
class ImagesListTestCase(APITestCase):
def test_images_list(self):
response = self.client.get('/api/', HTTP_AUTHORIZATION="JWT {}".format("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTkzNzUxMzMxLCJqdGkiOiI3NWE3NDNkMGU3MDQ0MGNiYjQ3NDExNjQ3MTI5NWVjNSIsInVzZXJfaWQiOjF9.7HkhZ1hRV8OtQJMMLEAVwUnJ0yDt8agFadAsJztFb6A"))
self.assertEqual(response.status_code, status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)
我尝试做
response = self.client.get('/api/', Authorization="Bearer <token>")
Run Code Online (Sandbox Code Playgroud)
还
response = self.client.get('/api/', Authorization="JWT <token>")
response = self.client.get('/api/', HTTP_AUTHORIZATION="Bearer <token>")
Run Code Online (Sandbox Code Playgroud) 我最近刚刚开始在react+express应用程序中使用jwt,并遇到了在哪里存储jwt令牌的问题。看来两个主要选项是 localStorage 和 cookies,它们都容易受到各种攻击(XSS 和 CRSF)。
但我发现react据说是XSS安全的(他们说React受XSS保护是什么意思?)那么可以使用localStorage来存储jwt吗?如果不是,行业标准是什么?
我有点惊讶的是,在搜索了一段时间后,我没有找到我想象的那么多答案(好吧,我没有找到),所以也许通过在这里询问我们可以帮助改善搜索结果。
我正在构建一个 REST api,它具有基于 JWT 的身份验证。有一个 /auth/login 路由在登录/密码验证后返回令牌,并且令牌随后在授权 http 标头中的每个路由中发送。
不,假设有人查询另一条路线(例如,/cars),但没有发送令牌(即在登录之前)。如果我返回 401 未经授权,我可以进行前端查询 /auth/login 来获取令牌。
但是,严格来说,这不符合 REST 规范,因为每个资源都应该从最初的资源开始就可以发现,并且访问 /cars 并收到 401 的客户端将不知道 /auth/login。
所以另一个选择是像 302 这样的重定向。但这种语义意味着资源被暂时移动,而事实并非如此(资源仍然是 /cars,你只需要先进行身份验证)。
那么,在“真正的”rest api 中执行此过程的正确方法是什么?
我有两场战争:app.war(struts web 应用程序)和rest.war(经典的rest api)。
app.war通过 jwt 令牌进行访问rest.war,该令牌在用户登录成功后生成app.war。
当用户使用时,需要通过使用jwt token从jsp发送ajax调用来a.war获取一些数据。rest.wara.war
jwt令牌的过期时间是15分钟,而会话超时时间app.war是1小时。
但是,如果 jwt 令牌过期,即使弹出要求用户重新登录,用户仍然可以访问app.war。
有一种选择:使用access_token和refresh_token,如果access_token过期,则使用refresh_token获取新的access_token和refresh_token。
对于这种方法,我有一些疑问:
首先,为什么使用两个令牌?因为我认为它们是相同的,只是refresh_token寿命比 access_token并使用refresh_token新的更长access_token,所以为什么不只是access_token将其过期时间设置得更长呢?
其次access_token,生成和的算法是否相同refresh_token,只是它们的过期时间不同?
第三,如果客户端使用令牌执行多个 api 调用(同步和异步),如果其中一个调用返回 401(令牌过期),如何处理?
我正在使用 Spring boot 开发 Angular 应用程序。我开发了一个登录页面,以用户名和密码作为输入。一种 Web 服务,用于从后端对用户进行身份验证并发送成功和失败的响应。以及身份验证成功后显示的主页。
发生的情况是,我也可以在不登录的情况下直接打开主页 URL,但这不是正确的。
我需要的是实现一种机制来检查用户是否登录,并据此显示 URL 页面或登录页面。
这是我的设置express-jwt:
exports.requireSignin = expressJwt({
secret: process.env.JWT_SECRET,
algorithms: ["HS256"],
userProperty: "auth"
});
Run Code Online (Sandbox Code Playgroud)
我正在使用它访问一条秘密路线进行测试,但是我没有req.user在此处的路线中获取该属性。它会产生一个空对象(未定义)。
router.get("/secret",requireSignin,(req, res) => {
res.json({
message: req.user,
});
});
Run Code Online (Sandbox Code Playgroud)
我正在使用 Postman 来测试并发送带有授权标头的令牌作为不记名令牌。
jwt ×10
node.js ×3
express ×2
reactjs ×2
angular ×1
api ×1
django ×1
django-rest-framework-simplejwt ×1
es6-modules ×1
express-jwt ×1
http ×1
java ×1
keycloak ×1
oauth-2.0 ×1
php ×1
rest ×1
security ×1
spring-boot ×1
unit-testing ×1
xss ×1