728x90
반응형
3.2.5 Service interface 코딩하기
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 파일을 열자
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
반응형
'프로그램 > 스프링' 카테고리의 다른 글
전자정부 스케줄링 crontab 설정 티베로에서 postgresql 연계 (0) | 2021.08.18 |
---|---|
[PWA] 자바로 pwa push 알림 기능 개발하기(12) (0) | 2021.08.03 |
[PWA] 자바로 pwa push 알림 기능 개발하기(10) (0) | 2021.08.03 |
[PWA] 자바로 pwa push 알림 기능 개발하기(9) (0) | 2021.08.03 |
[PWA] 자바로 pwa push 알림 기능 개발하기(8) (0) | 2021.08.03 |
댓글