본문 바로가기

애플 로그인 - 웹 구현 (NodeJS)

1. 애플 개발자 홈페이지에서 앱 아이디와 서비스 아이디를 등록한다.

 

2. 서비스 설정에서, redirect URL을 설정해준다. 이 떄, HTTPS만 가능하다. 그래서 테스트하기 위해서는 

https://glitch.com/ 를 이용한다. 그리고 키 파일을 다운로드 받는다

 

3. npm install apple-auth --save

 

4. appleAuth 객체를 만들어준다.

const appleKey = {
    client_id: 'yourClientID',
    team_id: 'yourTeamID',
    key_id: 'yourKeyID', 
    redirect_uri: 'https://test.glitch.me/redirect', // 등록한 redirect URL
    private_key_path: '키 파일 이름', // appleAuth 에 파라미터로 들어가기만 하면 된다
    scope: 'name email',
};
const appleAuth = new AppleAuth(appleKey, fs.readFileSync('키파일 경로').toString(), 'text');

애플 로그인 과정은 다른 로그인과 다르게 2번의 과정을 거친다. 

로그인 창에서, 로그인에 성공하면 redirectURL 로 응답이 보내진다. 받은 내용은 state, code, id_token, user 4개로 json형태이다.
User 키는 최초 가입 할 때만 받을 수 있다.  code는 5분 유효하다.

 

id_token을 디코딩해서 얻은 토큰들의 유효성을 검사하고 서명을 검증한다. 

 

그리고 https://appleid.apple.com/auth/keys 에서 얻어온 개인키로, id_token을 디코딩해서 나온 값과, code를 이용해 client_secret를 생성한다. 그리고 https://appleid.apple.com/auth/token 로 client_secret을 보내, refreshToken과 accessToken을 받는다.

 

위의 번거로운 과정은 apple-auth모듈을 쓰면 자동으로 처리해준다.

 

5.

    static appleSign = async (req) => {
        try {
            const response = await appleAuth.accessToken(req.body.code);
            const idToken = jwt.decode(response.id_token);

            // 처음 로그인 = 회원 가입
            if (req.body.user) {
                const user = {};
                user.id = idToken.sub;
                user.email = idToken.email;
                const { name } = JSON.parse(req.body.user);
                user.name = name; // name = { firstname: , lastname: }
                const username = name.lastname + name.firstname;
                return await UserDao.appleSign(user.id, username, user.email);
            } else {
                // 회원 가입 되어있음
                // idToken.sub 으로 회원 가입되어있는지 체크. 그래서 로그인 시킬지 말지 결정.
                return { accessToken: 'testtoken', refreshToken: 'testRefresh' };
            }
        } catch (err) {
            throw new Error(500, err);
        }
    };

appleAuth.accessToken이 client_secret을 만들고, 보내는 과정을 대신 처리해준다.