PHP - 구글 OTP(Google Authenticator) 인증 연동
라이브러리 구하기
아래 github 만 참고하면 간단히 구현할 수 있다.
아래 파일을 다운로드하고 include 한다.
예제 테스트
테스트 파일을 아래와 같이 작성한다.
<?php
require_once 'GoogleAuthenticator.php';
$ga = new GoogleAuthenticator();
$secret = $ga->createSecret();
echo "Secret is: ".$secret."<br>";
$qrCodeUrl = $ga->getQRCodeGoogleUrl('Admin', $secret, 'Blog');
echo "Google Charts URL for the QR-Code: ".$qrCodeUrl."<br>";
$oneCode = $ga->getCode($secret);
echo "Checking Code '$oneCode' and Secret '$secret'<br>";
$checkResult = $ga->verifyCode($secret, $oneCode, 2); // 2 = 2*30sec clock tolerance
if ($checkResult) {
echo 'OK';
} else {
echo 'FAILED';
}
<br>
<img src="<?=$qrCodeUrl?>">
결과는 아래와 같다.

Google Authenticator 앱으로 위 QR 코드를 스캔해 보면 아래와 같이 등록된다.

메소드별 부연 설명
createSecret()
- PXAGJ73SV44CKV27
설정 키를 생성한다.
해당 유저의 고유한 일련번호이다. 해당 유저에 대한 지속적인 인증 처리를 위해서는 DB 에 기록해야 한다.
DB 에 기록하지 않으려면 유저 아이디 또는 이메일 주소를 인코딩하여 생성하는 방법이 있다(해당 메소드를 쓰지 않고).
유저 입장에서는 키를 직접 입력하여 OTP 등록을 할 수도 있다(QR 코드를 스캔하지 않고).
getQRCodeGoogleUrl($name, $secret, $title = null, $params = array())
QR 코드 이미지 URL 을 생성한다.
예전에는 구글이 직접 서비스하는 chart.googleapis.com 페이지가 있었으나 중지되었다.
따라서 api.qrserver.com 또는 image-charts.com 등의 서비스를 가져다 써야한다.
$name, $title 은 보다시피 앱에 표시(저장)하는 용도이다.
getCode($secret, $timeSlice = null)
- 340072
미리 생성한 설정 키로 현재 유효한(최대 60초) 인증 키를 조회한다.
유저가 input 에 키를 입력하고 실제 검사하는 로직에서 비교하면 끝.