码匠客服

接入 JWT 认证

码匠支持通过 JWT (JSON Web Token) 的方式完成用户身份的认证。

认证流程

  1. 用户通过浏览器访问 JWT 服务并登陆;
  2. JWT 服务向浏览器写 cookie(cookie 名为 JWT);
  3. 用户通过浏览器访问码匠服务,并带上 JWT cookie;
  4. 码匠服务验证并解析 JWT cookie,识别用户身份,用户成功登陆码匠。

💡 说明

这里 JWT 采用 cookie 的方式存储,因此要求 JWT 服务和码匠服务在同域下。

JWT 生成

算法

采用 RSA 非对称加密:JWT server 通过私钥对 JWT 信息进行签名,码匠服务通过公钥进行验签,保证信息不被篡改。

Public key/Private key 生成

点击链接查看应用:Public key & Private key 生成

字段

字段必需/非必需描述
subrequired用户的唯一标识
namerequired用户名
avataroptional头像 URL
其他自定义扩展字段

示例代码(以java为例)

import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

public class JWTUtils {

    public static String generateJWT(RSAPrivateKey privateKey) {
        Algorithm algorithm = Algorithm.RSA256(privateKey);

        return JWT.create()
                .withSubject("1")
                .withClaim("name", "张三")
                .withClaim("avatar", "https://example.com/avatar-url")
                .withClaim("age", 30)
                // 可自定义其他扩展字段
                .sign(algorithm);
    }

    /**
     * Generate {@link PrivateKey} by private key in base64 string format.
     */
    public static PrivateKey generatePrivateKey(String privateKeyInBase64) throws NoSuchAlgorithmException, InvalidKeySpecException {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(processKey(privateKeyInBase64)));
    }

    /**
     * Generate {@link PublicKey} by public key in base64 string format.
     */
    public static PublicKey generatePublicKey(String publicKeyInBase64) throws NoSuchAlgorithmException, InvalidKeySpecException {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePublic(new X509EncodedKeySpec(processKey(publicKeyInBase64)));
    }

    private static byte[] processKey(String key) {
        return Base64.getDecoder().decode(key.replaceAll("\\n", "").replaceAll(" ", ""));
    }
}
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.3.0</version>
</dependency>

JWT 登陆配置

企业管理员可进入码匠主页设置 -> 身份源管理 -> JWT 进行设置。

如图,将 base64 格式的 Public key 填入即可。注意不要包含空格、换行符等特殊符号。