본문 바로가기
프로그램/스프링

[PWA] 자바로 pwa push 알림 기능 개발하기(11)

by cbwstar 2021. 8. 3.
728x90
반응형

3.2.5 Service interface 코딩하기

java
닫기
package pwapush.service; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import org.jose4j.lang.JoseException; import pwapush.model.UserSubscriInfo; public interface PwaPushService { /* push 알림 메세지 전송 부분을 선언한다. */ void sendMessage(Map<String, Object> messageMap, List<UserSubscriInfo> userSubscriInfo) throws GeneralSecurityException, InterruptedException, JoseException, ExecutionException, IOException; }

3.2.6 Service impl 코딩하기

서비스 인터페이스를 상속받은 구현체를 작성한다. 구현체를 작성하기 앞서 구독정보를 담을수 있는 클래스 파일을 먼저 코딩하자.

기존에 껍데기만 만들었던 PushSubscription.java 파일을 열자

java
닫기
package pwapush.service.impl; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PublicKey; import java.security.Security; import java.security.spec.InvalidKeySpecException; import java.util.Base64; import org.bouncycastle.jce.ECNamedCurveTable; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec; import org.bouncycastle.jce.spec.ECPublicKeySpec; import org.bouncycastle.math.ec.ECPoint; /* 구독정보를 전송하는 getter,setter정보를 관리한다. */ public class PushSubscription { ​​​private String endpoint; //전송서버 주소 ​​​private String key; //암호화 키 ​​​private String auth; //권한정보 ​​​public PushSubscription() { ​​​​​​​// Add BouncyCastle as an algorithm provider ​​​​​​​if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { ​​​​​​​​​​​Security.addProvider(new BouncyCastleProvider()); ​​​​​​​} ​​​} ​​​public void setAuth(String auth) { ​​​​​​​​​​​​​​​​this.auth = auth; ​​​​​​​​} ​​​​​​​​public String getAuth() { ​​​​​​​​​​​​​​​​return auth; ​​​​​​​​} ​​​​​​​​ ​​​​​​​​public void setKey(String key) { ​​​​​​​​​​​​​​​​this.key = key; ​​​​​​​​} ​​​​​​​​public String getKey() { ​​​​​​​​​​​​​​​​return key; ​​​​​​​​} ​​​​​​​​ ​​​/** * Returns the base64 encoded auth string as a byte[] */ ​​​​​​​​public byte[] getAuthAsBytes() { ​​​​​​​​​​​​​​​​return Base64.getUrlDecoder().decode(getAuth()); ​​​​​​​​} ​​​​​​​​ ​​​/** * Returns the base64 encoded public key string as a byte[] */ ​​​​​​​​public byte[] getKeyAsBytes() { ​​​​​​​​​​​​​​​​return Base64.getUrlDecoder().decode(getKey()); ​​​​​​​​} ​​​​​​​​ ​​​​​​​​public void setEndpoint(String endpoint) { ​​​​​​​​​​​​​​​​this.endpoint = endpoint; ​​​​​​​​} ​​​​​​​​public String getEndpoint() { ​​​​​​​​​​​​​​​​return endpoint; ​​​​​​​​} ​​​/** * Returns the base64 encoded public key as a PublicKey object */ ​​​public PublicKey getUserPublicKey() throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException { ​​​​​​​KeyFactory kf = KeyFactory.getInstance("ECDH", BouncyCastleProvider.PROVIDER_NAME); ​​​​​​​ECNamedCurveParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1"); ​​​​​​​ECPoint point = ecSpec.getCurve().decodePoint(getKeyAsBytes()); ​​​​​​​ECPublicKeySpec pubSpec = new ECPublicKeySpec(point, ecSpec); ​​​​​​​return kf.generatePublic(pubSpec); ​​​} }

 

특별한 내용은 없다. 공개키 부분은  base64로 인코딩 하여 클라이언트로 전송하기 위해 설정한다.

728x90
반응형


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."