Java 服务端 Token 实现指南

作为一名经验丰富的开发者,我很高兴能够帮助刚入行的小白了解如何在 Java 服务端实现 Token。Token 是一种常见的身份验证机制,它允许服务端在不存储用户密码的情况下验证用户身份。以下是实现 Java 服务端 Token 的详细步骤和代码示例。

流程图

首先,让我们通过一个流程图来了解整个实现过程:

flowchart TD
    A[开始] --> B[用户登录]
    B --> C[验证用户信息]
    C --> D{验证成功?}
    D -- 是 --> E[生成 Token]
    D -- 否 --> F[返回错误信息]
    E --> G[将 Token 发送给客户端]
    G --> H[客户端存储 Token]
    H --> I[客户端请求受保护资源]
    I --> J[服务端验证 Token]
    J --> K{验证成功?}
    K -- 是 --> L[返回受保护资源]
    K -- 否 --> M[返回错误信息]
    L --> N[结束]
    M --> N

步骤和代码实现

1. 用户登录

用户登录是实现 Token 的第一步。我们需要创建一个登录接口,接收用户名和密码,然后验证用户信息。

@PostMapping("/login")
public ResponseEntity<?> loginUser(@RequestBody LoginRequest loginRequest) {
    User user = userService.validateUser(loginRequest.getUsername(), loginRequest.getPassword());
    if (user != null) {
        String token = generateToken(user);
        return ResponseEntity.ok(new LoginResponse(token));
    } else {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password");
    }
}

2. 验证用户信息

在这一步,我们需要验证用户输入的用户名和密码是否正确。这通常涉及到查询数据库。

public User validateUser(String username, String password) {
    return userRepository.findByUsernameAndPassword(username, password);
}

3. 生成 Token

如果用户验证成功,我们需要生成一个 Token。这里我们可以使用 JWT(JSON Web Tokens)来实现。

private String generateToken(User user) {
    String token = Jwts.builder()
            .setSubject(user.getUsername())
            .setIssuedAt(new Date())
            .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1 hour expiration
            .signWith(SignatureAlgorithm.HS256, "secretKey")
            .compact();
    return token;
}

4. 将 Token 发送给客户端

生成 Token 后,我们需要将其发送给客户端。这通常通过响应体完成。

public class LoginResponse {
    private String token;

    public LoginResponse(String token) {
        this.token = token;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}

5. 客户端存储 Token

客户端收到 Token 后,需要将其存储在本地,以便后续请求使用。

6. 客户端请求受保护资源

当客户端需要访问受保护的资源时,它需要在请求头中包含 Token。

GET /protected HTTP/1.1
Host: example.com
Authorization: Bearer <token>

7. 服务端验证 Token

服务端接收到请求后,需要验证请求头中的 Token 是否有效。

@PreAuthorize("hasAuthority('SCOPE_USER')")
public ResponseEntity<?> getProtectedResource() {
    return ResponseEntity.ok("This is a protected resource");
}

类图

以下是实现 Token 所需的类图:

classDiagram
    class LoginRequest {
        <<interface>> Serializable
        +String getUsername()
        +String getPassword()
    }
    class LoginResponse {
        +String getToken()
    }
    class User {
        +String getUsername()
        +String getPassword()
    }
    class UserService {
        +User validateUser(String username, String password)
    }
    class UserRepository {
        +User findByUsernameAndPassword(String username, String password)
    }

结尾

通过以上步骤和代码示例,你应该对如何在 Java 服务端实现 Token 有了更清晰的了解。记住,安全是最重要的,确保你的 Token 生成和验证机制是安全的。祝你在开发过程中一切顺利!