我正在开发 REST API,并决定使用 JWT 进行身份验证/安全。有一个服务可以处理登录验证,还有一个过滤器可以绑定到每个需要身份验证的服务。
登录服务.java:
@Path("login")
public class LoginService {
private final static long EXPIRATION_TIME = 60000;
@POST
@Produces("application/json")
@Consumes("application/json")
public Response authenticateUser(Credentials c) {
Users login;
UsersDAO u = new UsersDAO();
try {
login = u.getAuthentication(c);
String token = generateToken(login.getIdUser(), login.getLogin(), login.getRole());
// Return the token on the response
return Response.ok().header(AUTHORIZATION, "Bearer " + token).build();
} catch (Exception e){
System.out.println("Exception: " + e.toString());
return Response.status(Response.Status.UNAUTHORIZED).build();
}
}
private String generateToken(int id, String login, int role) {
long nowMillis …Run Code Online (Sandbox Code Playgroud) 我是第一次使用 JSON Web 令牌 (JWT)。我正在使用 Hydra-Express 框架制作 Node.js 应用程序。我想使用 JWT 进行身份验证。根据文档,我将 JSON 令牌返回到前端。
var tokenData = {
username: req.body.username,
};
var result = {
username: req.body.username,
token: jwt.sign(tokenData, 'secret', { expiresIn: 60 * 60 })
};
res.json(result);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将此 JSON 令牌保存到我的浏览器标头中,以便它不会丢失并与标头一起再次发送到后端。如何将其保存在浏览器存储中,并在每次向后端发送请求时将其添加到请求标头中?
好吧,这可能是一个非常菜鸟或幼稚的问题,但我尝试在互联网上搜索,并且只有在没有找到任何有效的东西后才诉诸堆栈溢出。我一直在阅读有关基于令牌的身份验证以及基于 Cookie 的身份验证。我认为基于令牌的身份验证对于单页 Web 应用程序更好,但无法清楚地理解原因。我将使用 Nodejs 和 AngularJS 来完成同样的任务。
我有一个使用 AngularJS、JWT和 django 作为后端框架的项目。JWT 用户身份验证工作正常。
同时我也在努力
经过研究,我明白它不应该工作,因为 request.session 没有设置。
所以问题是我怎样才能允许仅从经过身份验证的用户获取此视图中的请求?
我有想法在 django 中创建自定义装饰器,它将检查将在角度服务的 get/post 请求中发送的令牌,但我怀疑它是否有效。
我有一个 Android 应用程序,它使用 google 身份验证来注册用户
,我正在使用它laravel socillite进行身份验证
我无法让它工作,因为 android 应用程序向我发送了授权代码而不是访问令牌,而且我不知道如何从中获取访问令牌根据Authorization Code
我的理解,我应该执行以下操作:
access token从 android获取Authorization CodeSocialite::driver('google')->userFromToken($token)获取用户数据JWT到 Android 设备laravel socillite 好吧,说实话,这个标题有点误导,但我想不出更好的标题。
我有一个基于 Spring Boot 的服务器和一个 Android 应用程序。用户通过用户名和密码进行身份验证,然后获得 JWT 身份验证令牌,该令牌随后在访问 API 的后续请求中使用。令牌的有效期为一小时,之后用户需要使用其凭据再次登录,这对用户来说很不方便。事实上,仅当用户明确注销应用程序时,我才需要应用程序再次请求凭据。
我认为使用刷新令牌是这个问题的答案,但我不确定如何在当前的代码中实现它?
AuthController的authenticate方法
@PostMapping("/signin")
public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
loginRequest.getUsernameOrEmail(),
loginRequest.getPassword()
)
);
SecurityContextHolder.getContext().setAuthentication(authentication);
String jwt = tokenProvider.generateToken(authentication);
return ResponseEntity.ok(new JwtAuthenticationResponse(jwt));
}
Run Code Online (Sandbox Code Playgroud)
Jwt认证响应
public class JwtAuthenticationResponse {
private String accessToken;
private String refreshToken = "Blank";
private String tokenType = "Bearer";
//Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)
JwtTokenProvider
@Component
public class JwtTokenProvider {
private static final Logger logger = LoggerFactory.getLogger(JwtTokenProvider.class);
@Value("${app.jwtSecret}")
private String jwtSecret;
@Value("${app.jwtExpirationInMs}") …Run Code Online (Sandbox Code Playgroud) 我正在使用 REST API 创建一个新的 SPA,对于后端,我使用 Rails 和 devise_token_auth。我是令牌身份验证的新手,在搜索时我看到很多支持 JWT 的前端库,但我无法判断这是否与 devise_token_auth 兼容。
JWT 是网络令牌的标准吗?devise_token_auth 使用的是它吗?
我有以下代码来解码 Javascript 中的 Jwt 令牌(参考:如何解码 javascript 中的 jwt 令牌)
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
function parseJwt(token) {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
console.log(JSON.parse((atob(base64))))
};
parseJwt(token);Run Code Online (Sandbox Code Playgroud)
我从上面的代码中获取了我需要的有效负载,但是我在节点中实现它,我们没有“atob”函数来解码base64编码的字符串
看来我们需要在节点中使用Buffer。我进行了研究并提出了以下不起作用的解决方案。
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
function parseJwt(token) {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
const buff = new Buffer(base64, 'base64');
const payloadinit = buff.toString('ascii');
const payload = JSON.parse(payloadinit);
console.log(payload)
};
parseJwt(token);Run Code Online (Sandbox Code Playgroud)
如果有更好的方法,请告诉我 - 无库(Jwt 或解码 Jwt)
我希望为移动应用程序采用基于令牌的身份验证,只要用户未注销,该应用程序就可以保持用户登录状态。我的方法是在用户登录/注册时创建 JWT 刷新令牌;此令牌永不过期,并持续刷新 20 分钟访问令牌。
当他们注销时就会出现问题。我读过解决此问题的最佳方法是将 Redis 上的 JWT 列入黑名单以存储已撤销的密钥。但是,由于 JWT 永不过期,因此该记录永远无法从 Redis 中删除,并且可能会开始占用我的大量内存。
我应该担心这个吗?或者 Redis 在这方面内存效率高吗?有没有更好的方法来撤销 JWT 且不会过期?
我想在我的 nginx 上设置 jwt auth 但出现此错误:
nginx: [emerg] unknown directive "auth_jwt" in /usr/local/etc/nginx/nginx.conf
Run Code Online (Sandbox Code Playgroud)
我的 nginx 版本:nginx/1.15.8 操作系统:macOs Mojave v10.14.2
我在谷歌或其他网站上找不到答案。
/nginx.cofnig:
location / {
auth_jwt "closed site" token=$cookie_token;
auth_jwt_key_file conf/api_secret.jwk;
try_files $uri /index.html =404;
}
Run Code Online (Sandbox Code Playgroud)