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

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

by cbwstar 2021. 8. 3.
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
반응형

댓글



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

loading