Token的技术详解

 前言:

第一次团队独立做一个前后端分离的项目,学到了很多东西,然后也是增长了一些经验。目前后端的基本完成,还剩小程序端的,在此就稍微歇脚写几篇博客做一个总结。

然后第一个是选择了Token,这个技术运用的十分广泛,然后又是登入后的第一个技术,就拿出来好好详细写一些。其实主要选择这个是因为我旁边一哥们面试的时候面试官问了一个Token,然后那个面试官不知道英语四级过没过他竟然把Token读的和Cookie一样,然后就懵了,有点离谱。。所以就借着这个机会详细总结一下Token这个技术。

用途:

Token 是一个常见的技术概念,广泛用于身份验证、授权、API 访问控制等场景。Token 是一种用于在不同系统、应用程序或服务之间传递身份或权限信息的字符串。Token 通常是一个加密或编码的字符串,包含了用户信息、权限、有效期等信息。 

Token 的运用场景

a. 身份验证

Token 用于验证用户身份,确保请求是由合法用户发出的。常见的实现是通过 JWT 进行用户认证和授权。

b. 授权

Token 也用于授权,确保用户对特定资源或操作具有足够的权限。例如,OAuth Token 用于授权第三方应用访问用户的数据。

c. API 安全

API Token 用于控制对 API 的访问,确保只有授权的用户或应用程序可以访问 API。

1. 身份验证和授权

在身份验证系统中,Token 通常用于身份验证和授权。最常见的是 JSON Web Token (JWT)。

产生:当用户登录时,服务器会生成一个包含用户信息的 JWT,并将其返回给用户。
作用:用户在访问受保护的资源时,将 JWT 附加到请求头中,服务器通过验证 JWT 来确认用户身份。

什么是JWT??

JWT 是一种常用的 Token 格式,用于在网络应用中传递声明。它由三部分组成:Header(头部)、Payload(负载)和 Signature(签名)。

Header:包含 Token 类型和加密算法,例如 {"alg": "HS256", "typ": "JWT"}。
Payload:包含声明或用户信息,例如 {"sub": "1234567890", "name": "John Doe", "admin": true}。
Signature:用来验证 Token 是否被篡改,通过对 Header 和 Payload 进行加密得到,例如 HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)。

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.Claims;

import java.util.Date;

public class JwtUtil {
    private static final String SECRET_KEY = "your-256-bit-secret";

    // 生成 JWT
    public static String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1 hour
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // 解析 JWT
    public static Claims parseToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }
}

 OAuth Token
OAuth 是一个授权框架,OAuth Token 用于授权访问资源。它有两个主要类型:

Access Token:用于访问受保护的资源,通常具有短期有效性。
Refresh Token:用于获取新的 Access Token,通常具有较长的有效性。

import java.util.UUID;

public class OAuthUtil {
    // 生成 Access Token
    public static String generateAccessToken() {
        return UUID.randomUUID().toString();
    }
}

 

 Token令牌是如何携带在接口上每次访问校验的??

这个也是我的那个同学问到的问题(翻译过来的)。

Token 令牌在接口上每次访问时的校验通常通过以下步骤进行:

1. Token 的生成和获取

首先,用户在进行身份验证后(如登录或授权),服务器生成一个 Token 并返回给客户端。这个 Token 可能是 JWT、OAuth Token 或其他自定义格式的字符串。

2. Token 的传递方式

客户端通常将 Token 放置在 HTTP 请求的头部(Header)中,作为授权信息发送给服务器。常见的做法是将 Token 放在 Authorization 头部的 Bearer 字段中,格式如下:
Authorization: Bearer your_token_here


3. 接收和解析 Token

服务器在接收到请求时,会从请求头中提取 Token。具体实现可能依赖于框架或库来处理 Token 的解析和验证。

4. Token 的验证

服务器通过以下步骤验证 Token 的合法性:

解析 Token:使用事先定义好的密钥(对于 JWT)或验证服务(对于 OAuth Token),解析 Token 的内容。这通常涉及到对 Token 的解码和验证签名(对于 JWT)或向授权服务器验证 Token 的有效性(对于 OAuth Token)。

验证 Token 的有效期:检查 Token 是否过期。对于 JWT,Payload 中包含了 Token 的过期时间,服务器可以通过比较当前时间和过期时间来验证 Token 是否仍然有效。

验证 Token 的权限:如果 Token 包含了权限信息或角色信息,服务器可能还会根据请求的操作(例如访问特定资源)来验证 Token 中的权限是否足够。

5. 响应和处理

根据 Token 的验证结果,服务器会相应地处理请求:如果 Token 验证通过且权限足够,则允许访问请求的资源或执行操作。
如果 Token 验证失败(如过期、无效或权限不足),则拒绝访问,并可能返回相应的错误信息或状态码(如 401 Unauthorized)。
示例代码(使用 Spring Security 进行 Token 验证)
以下是使用 Spring Security 框架进行 JWT Token 验证的简单示例:

import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.jwt.JwtHelper;
import org.springframework.security.jwt.crypto.sign.MacSigner;
import org.springframework.stereotype.Service;

@Service
public class JwtUserDetailsService implements UserDetailsService {

    private static final String SECRET_KEY = "your_secret_key_here";

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 实际项目中,从数据库或其他存储中获取用户信息
        // 这里简单返回一个 UserDetails 对象
        return new org.springframework.security.core.userdetails.User(username, "", new ArrayList<>());
    }

    public boolean validateToken(String token) {
        try {
            Jwt jwt = JwtHelper.decodeAndVerify(token, new MacSigner(SECRET_KEY));
            // Token 验证成功
            return true;
        } catch (Exception e) {
            // Token 验证失败
            return false;
        }
    }
}


在实际应用中,还可以根据具体情况对 Token 的验证逻辑进行扩展,例如添加更复杂的权限控制、使用 OAuth Token 等其他身份验证方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值