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을 만들고, 보내는 과정을 대신 처리해준다.