애플 앱 인증 로그 인

2948 단어 Java
설명
애플 앱 개발 완료 후 위 챗 QQ 원 키 로그 인 을 지원 합 니 다. 심사 시 애플 로그 인 을 요구 합 니 다. 애플 로그 인 은 두 가지 방식 이 있 습 니 다. 하 나 는 jwt 이 고 다른 하 나 는 권한 수여 코드 모델 입 니 다. 여 기 는 jwt 모델 을 사용 하여 언어 를 자바 로 개발 합 니 다.
 
코드 구현
관련 기술 사용: jwt + restTemplate + fastjson
/**
     *   apple  token
     * @param jwt
     * @return
     * @throws Exception
     */
    @Override
    public JSONObject appleAuth(String jwt) throws Exception {
        //  identityToken
        String[] jwtArray = jwt.split("\\.");
        String claim = new String(Base64.decodeBase64(jwtArray[1]));
        JSONObject claimJson = JSONObject.parseObject(claim);
        //      kid
        String header = new String(Base64.decodeBase64(jwtArray[0]));
        JSONObject headerJson = JSONObject.parseObject(header);
        //         
        String body = restTemplate.getForObject("https://appleid.apple.com/auth/keys",String.class);
        JSONObject jsonObject = JSONObject.parseObject(body);
        String keys = jsonObject.getString("keys");
        JSONArray arr = JSONObject.parseArray(keys);
        JSONObject appleKey1 = JSONObject.parseObject(arr.getString(0));
        JSONObject appleKey2 = JSONObject.parseObject(arr.getString(1));
        JSONObject appleKey = appleKey1;
        if( !headerJson.getString("kid").equals(appleKey1.getString("kid")) ){
            appleKey = appleKey2;
        }
        //       
        BigInteger modulus = new BigInteger(1, Base64.decodeBase64(appleKey.getString("n")));
        BigInteger publicExponent = new BigInteger(1, Base64.decodeBase64(appleKey.getString("e")));
        RSAPublicKeySpec rsaPublicKeySpec = new RSAPublicKeySpec(modulus, publicExponent);

        //   PublicKey
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PublicKey publicKey = kf.generatePublic(rsaPublicKeySpec);
        //    
        return verify(publicKey,jwt,claimJson);
    }

    public JSONObject verify(PublicKey key, String jwt, JSONObject claimJson){
        //      
        JSONObject result = new JSONObject();
        boolean status = false;
        //  
        JwtParser jwtParser = Jwts.parser().setSigningKey(key);
        jwtParser.requireIssuer(claimJson.getString("iss"))
                .requireAudience(claimJson.getString("aud"))
                .requireSubject(claimJson.getString("sub"));
        try {
            Jws claim = jwtParser.parseClaimsJws(jwt);
            if (claim != null && claim.getBody().containsKey("auth_time")) {
                //    
                status = true;
                //          
                result.put("sub",claimJson.getString("sub"));
            }
        }catch (Exception e) {
            log.error("    ");
        }
        result.put("status",status);
        return result;
    }

좋은 웹페이지 즐겨찾기