본문으로 바로가기

PHP - 구글 OTP(Google Authenticator) 인증 연동

category 코딩/PHP 2024. 8. 20. 16:48

 

라이브러리 구하기

아래 github 만 참고하면 간단히 구현할 수 있다.

 

 

아래 파일을 다운로드하고 include 한다.

GoogleAuthenticator.php
0.01MB

 

예제 테스트

테스트 파일을 아래와 같이 작성한다.

 

<?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())

  • https://api.qrserver.com/v1/create...(생략)

QR 코드 이미지 URL 을 생성한다.

예전에는 구글이 직접 서비스하는 chart.googleapis.com 페이지가 있었으나 중지되었다.

따라서 api.qrserver.com 또는 image-charts.com 등의 서비스를 가져다 써야한다.

$name, $title 은 보다시피 앱에 표시(저장)하는 용도이다.

 

getCode($secret, $timeSlice = null)

  • 340072

미리 생성한 설정 키로 현재 유효한(최대 60초) 인증 키를 조회한다.

유저가 input 에 키를 입력하고 실제 검사하는 로직에서 비교하면 끝.