Add PKCEUtils.java
parent
c79b026f50
commit
be545e3953
|
@ -0,0 +1,56 @@
|
||||||
|
package com.monkeyk.sos.infrastructure;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.RandomStringUtils;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 2023/10/16 22:45
|
||||||
|
* <p>
|
||||||
|
* PKCE tool:
|
||||||
|
*
|
||||||
|
* @author Shengzhao Li
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
public abstract class PKCEUtils {
|
||||||
|
|
||||||
|
private static final String ALG = "SHA-256";
|
||||||
|
|
||||||
|
|
||||||
|
private PKCEUtils() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 随机生成32的 code_verifier
|
||||||
|
*
|
||||||
|
* @return code_verifier
|
||||||
|
*/
|
||||||
|
public static String generateCodeVerifier() {
|
||||||
|
// 1. 随机生成code_verifier
|
||||||
|
String codeVerifierVal = RandomStringUtils.random(32, true, true);
|
||||||
|
//2. 对 code_verifier 进行base64 encode
|
||||||
|
return Base64.getEncoder().encodeToString(codeVerifierVal.getBytes(StandardCharsets.UTF_8));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据指定的 code_verifier 计算 code_challenge
|
||||||
|
*
|
||||||
|
* @param codeVerifier code_verifier
|
||||||
|
* @return code_challenge
|
||||||
|
*/
|
||||||
|
public static String generateCodeChallenge(String codeVerifier) {
|
||||||
|
MessageDigest md;
|
||||||
|
try {
|
||||||
|
md = MessageDigest.getInstance(ALG);
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new IllegalStateException("JDK not found alg: '" + ALG + "' ??", e);
|
||||||
|
}
|
||||||
|
byte[] digest = md.digest(codeVerifier.getBytes(StandardCharsets.US_ASCII));
|
||||||
|
return Base64.getUrlEncoder().withoutPadding().encodeToString(digest);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.monkeyk.sos.infrastructure;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.RandomStringUtils;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 2023/10/16 22:53
|
||||||
|
*
|
||||||
|
* @author Shengzhao Li
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
class PKCEUtilsTest {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void generateCodeVerifier() {
|
||||||
|
|
||||||
|
String verifier = PKCEUtils.generateCodeVerifier();
|
||||||
|
assertNotNull(verifier);
|
||||||
|
assertTrue(verifier.length() >= 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void generateCodeChallenge() {
|
||||||
|
|
||||||
|
String verifier = PKCEUtils.generateCodeVerifier();
|
||||||
|
assertNotNull(verifier);
|
||||||
|
|
||||||
|
String challenge = PKCEUtils.generateCodeChallenge(verifier);
|
||||||
|
assertNotNull(challenge);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PKCE 需要的参数生成测试
|
||||||
|
* code_challenge_method : S256 (alg: SHA-256) 固定值
|
||||||
|
* code_verifier : 随机生成且base64 encode的值 (推荐随机值至少32位)
|
||||||
|
* code_challenge : 对 code_verifier 使用指定算法进行计算(digest)并base encode的值
|
||||||
|
*
|
||||||
|
* @throws Exception e
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void pkceFlow() {
|
||||||
|
|
||||||
|
// 1. 随机生成code_verifier
|
||||||
|
String codeVerifier = PKCEUtils.generateCodeVerifier();
|
||||||
|
// System.out.println("code_verifier -> " + codeVerifier);
|
||||||
|
|
||||||
|
//2. 按指定算法计算 挑战码 code_challenge
|
||||||
|
String codeChallenge = PKCEUtils.generateCodeChallenge(codeVerifier);
|
||||||
|
|
||||||
|
assertNotNull(codeChallenge);
|
||||||
|
// System.out.println("code_challenge -> " + codeChallenge);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue