사실 보안상 그러면 안되지만, 여러개의 키를 관리하기 귀찮아서 하나의 PEM 키로 모든 서버에 로그인 하고 싶었다.

그러기 위해선 각 서버의 Authorized_keys 에 내 public key의 내용물들이 저장되어 있어야 하는데 PEM 만 가지곤 알수 없지 않은가 ?!


그래서 찾아봤다. PEM 키를 가지고 public Key 를 생성하는 방법을 

생각보다 간단하더라


콘솔에 로그인 후 PEM 키를 서버로 올린다.

그리고 입력한다.


$ ssh-keygen -y -f private_key.pem > public_key.pub


끝.

이걸 검색 하는 분들은, 이게 왜 필요한지도 아실거라 생각한다.

그리고 정리하긴 항상 귀찮으니 대충 알 수 있을 정도로만 정리하려 한다.


[중요한 부분]

구글 영수증 검증을 위해서는 Access Token 이라는 것이 필요하다.

그런데 이 Access Token은 유효기간이 있다.! (1시간정도)

간이 지나면 현재 Access Token으로는 검증을 할 수 없기 때문에,

이를 교체 해야 한다. 그래서 필요한 것이 Refresh Token 이다.


아래 내용은 Refresh Token 을 얻는 방법 부터 시작된다.



[구글 영수증 검증을 위해서는]


1. 구글 개발자 콘솔의 권한이 필요하다.

  (https://console.developers.google.com/apis)


2. 프로젝트를 선택한다 ( 프로젝트가 없다면 새프로젝트를 생성한다)


3. 사용자 인증정보를 만듭니다.

    oAuth 클라이언트 ID 를 선택해야 한다.


  



4. 우리는 웹으로 검증프로세스를 진행할 것이기 때문에, 웹 어플리케이션으로 만든다.


5. 만드는 과정에서 보면 승인된 리디렉션 URI 를 입력해야 한다. 

   구글에 RefreshToken 발급 요청 시 이곳에 기록한 URL로 연결이 되기 때문에 반드시 접속 가능한 주소를 입력한다.


6. 생성을 완료하고 생성한 정보를 누르면 아래와 같이 ID와 보안코드가 발급된다. (이것도 중요함!)


7. API 및 서비스 사용설정을 누르고 Google Play Android Developer API 로 가서 사용설정을 누른다.


8. RefreshToken 발급을 위해서 특정 Code를 발급받아야 한다. 이 과정은 아래의 URL을 사용자 설정에 맞게 수정 후 웹브라우저로 접속한다.


${client_id} = 6번의  client ID

${redirect_url} = 6번에서 등록한 접속 가능한 RedirectUrl


[요청 URL]

https://accounts.google.com/o/oauth2/auth?
scope=https://www.googleapis.com/auth/androidpublisher
&response_type=code
&state=test
&access_type=offline
&client_id=${client_id}
&redirect_uri=${redirect_url}
&approval_prompt=force


위 URL을 복사해 가더라도 편의상 보기 편하기 위해 해논 개행은 꼭 다 붙이고 진행하길 바란다


위 URL 로 접속하면 이제 get 파라미터로 code가 전달 된다.

이 code를 꼭 기억하도록 한다. RefreshToken 을 획득하기 위해 꼭 필요하다.


9. access token 과 refresh token 획득을 위해 다음 url 에 요청한다

   (필자는 curl을 통해 호출했다)




$fParam = array(

'code' => ${client_code}, // 8 에서 발급받은 code

'client_id' => ${client_id}, // 8 에서 사용한 google client id

'client_secret' => ${client_secret}, // 8 에서 사용한 google client secret

'redirect_uri' => ${return url}, // 8 에서 사용한 google return url

'grant_type' => 'authorization_code',

);


token 발급을 위한 요청  url  은 아래와 같다.


$ch = curl_init();

curl_setopt( $ch, CURLOPT_URL, 'https://accounts.google.com/o/oauth2/token' );

curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded') );

curl_setopt( $ch, CURLOPT_HEADER, 0 )

curl_setopt( $ch, CURLOPT_POST, TRUE )

curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query($fParam) )

curl_setopt( $ch, CURLOPT_TIMEOUT, 300 )

curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );

curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );

curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );


$result = curl_exec( $ch );

if ( $result === FALSE ) {

die( 'Curl failed: ' . curl_error( $ch ) );

}


curl_close( $ch );

return json_decode( $result );


위 코드를 작성한 URL 에 접속하면 요청이  잘 내려온다

아래와 같은 형식으로


stdClassObject ( 

[access_token] => user_accessToken

[expires_in]=>3600

[refresh_token]=>user_refreshToken

[scope] => https://www.googleapis.com/auth/androidpublisher 

[token_type] => Bearer 

)


원하는 Access Token 과 RefreshToken 이 니왔다.


자세히 보면 expires_in 3600 이라는게 있는데, 이게 Access Token 의 유효시간이다.

저 배열을 그대로 DB 에 담아두고 Refresh Token 을 이용해 Access Token 을 주기적으로 갱신해야 한다.


10. Refresh Token . 을 사용해 AccessToken 갱신하기


$fParam array(

'refresh_token' => ${refresh_token}, // 9 에서 발급받은 refresh tolen

'client_id' => ${client_id}, // 8 에서 사용한 google client id

'client_secret' => ${client_secret}, // 8 에서 사용한 google client secret

'grant_type' => 'refresh_token',

);



$ch curl_init();

curl_setopt$chCURLOPT_URL'https://accounts.google.com/o/oauth2/token' );

curl_setopt$chCURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded') );

curl_setopt$chCURLOPT_HEADER)

curl_setopt$chCURLOPT_POSTTRUE )

curl_setopt$chCURLOPT_POSTFIELDS, http_build_query($fParam) )

curl_setopt$chCURLOPT_TIMEOUT300 )

curl_setopt$chCURLOPT_RETURNTRANSFER);

curl_setopt$chCURLOPT_SSL_VERIFYHOST);

curl_setopt$chCURLOPT_SSL_VERIFYPEERFALSE );


$result curl_exec$ch );

if $result === FALSE ) {

die'Curl failed: ' curl_error$ch ) );

}


curl_close$ch );

return json_decode$result );


위와 같은 형식으로 던지면 9번의 결과와 같게 json 타입으로 갱신된 Access Token이 넘어온다.

이 항목은 Access Token Expire 되기 전에 주기적으로 갱신해야 한다.



여기까지가 영수증 검증을 위한 준비 단계 이다. 휴 힘들었다.


11. 마지막, 영수증 상태 검증


영수증 검증을 위해 아래 URL 을 호출한다.


${PackageName} : 앱 패키지 이름

${ProductID} : 인앱 구매 상품의 제품코드

${PuchaseToken} : 결제 후 내려오는 영수증 번호

${access_token} : 10번을 통해 갱신되는  access token


https://www.googleapis.com/androidpublisher/v1.1/applications/${PackageName}/inapp/${ProductID}/purchases/${PuchaseToken}?access_token=${access_token}


위 URL 을 file_get_content 등을 통해 호출하면 json type 으로 리턴값이 온다.


결과의 purchaseState 의 값이 0 일 경우 정상적인 영수증이다.


이 정도면.. 되지않을까...?




'기억할것들 > PHP' 카테고리의 다른 글

php-oracle 연동  (0) 2020.02.24
centos7 php-7 mssql 연결  (0) 2019.12.10
[CSS] 로 문자열 줄임 처리하기  (0) 2018.08.29
php 7.2.8 소스 설치  (0) 2018.08.13

1. 관련 모듈 설치

1
$ yum install lua-devel libxml2-devel gcc gcc-c++ flex compat-gcc-* libjpeg-devel libpng-devel freetype-devel gd-devel expat-devel
cs

2. libnghttpd2 설치

1
2
$ yum install epel-release
$ yum install --enablerepo=epel libnghttp2 libnghttp2-devel
cs

 

3. openssl 설치 (1.0.1e 버전 이상만 되면 된다) 

1
2
3
4
5
$ ./config --prefix=/usr/local/openssl shared zlib
$ make && make install
$ ln -/usr/local/openssl/bin/openssl /usr/bin/openssl
( 이 작업 전에 기존에 등록되어 있는 파일이 있다면 백업정돈 하자)
$ openssl version
cs

마지막 명령줄을 실행하면 openssl 의 버전이 나오면서 내가 설치한 버전이 잘 설치 되었는지 확인할 수 있다.

하지만,! 설치고 에러가 날 수 있는데, libssl.so.1.1 / libcrypto.so.1.1 이 없다는 ...

위 에러 발생시 openssl 의 압축을 해제 한 폴더를 보면 두 파일이 있다.

/usr/lib64 로 복사하면 정상 실행 된다.

 

4. apr 설치

1
2
$ ./configure
$ make && make install
cs

만약 configure 하는 도중 libtoolT 가 없다고 하면, ln -s libtool libtoolT 를 한다

 

5. apr-util 설치

1
2
$ ./configure --with-apr=/usr/local/apr --with-expat=builtin
$ make && make install
cs

 

6. pcre 설치 (pcre2를 해선 안된다. pcre2 는 컴파일 시 아파치가 인식하지 못한다)

1
2
$ ./configure --prefix=/usr/local/pcre
$ make && make install
cs

 

7. Apache 설치 (run.sh 와 같은 파일에 작성 후 실행시키면 편하다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
./configure \
    --prefix=/apps/httpd-2.4.33 \
    --enable-module=most \
    --enable-mods-shared=all \
    --enable-so \
    --with-mpm=event \
    --enable-cache \
    --enable-deflate \
    --enable-expires \
    --enable-cgi \
    --enable-vhost-alias \
    --enable-rewrite \
    --enable-mime-magic \
    --enable-ssl \
    --enable-http2 \
    --with-ssl=/usr/local/openssl \
    --with-apr=/usr/local/apr \
    --with-apr-util=/usr/local/apr \
    --with-pcre=/usr/local/pcre/bin/pcre-config
cs

 

8. httpd.conf 수정 (HTTP2 사용을 위해서 추가작업이 필요하다)

 

1
2
3
4
5
LoadModule http2_module modules/mod_http2.so
<IfModule http2_module>
    ProtocolsHonorOrder    On
    Protocols h2 h2c http/1.1
</IfModule>
cs

 

9. HTTP2 는 SSL 환경에서만 동작이 가능하기 때문에 http-ssl.conf 파일도 수정하도록 한다.

1
2
SSLProtocol    ALL -SSLv2 -SSLv3
SSLCipherSuite    ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK
cs

 

10. 서비스 등록하기

1
2
3
$ cp {설치폴더}/bin/apachectl /etc/init.d/httpd
$ service httpd start
$ service httpd stop
cs

 

위 설정까지만 해도 충분히 아파치는 잘 동작한다.

단, PHP 와 연결을 위한 설정 몇개를 더 쓴다

 

11. httpd.conf 에서

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>
 
<IfModule mime_module>
    AddType application/x-httpd-php .php .phtml
    AddType application/x-httpd-php-source .phps
</IfModule>
 
<Directory "/home/*">
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from All
    Require all granted
</Directory>
cs

 

서비스 자동 실행 등록 등의 작업이 필요하다면 #여기로

+ Recent posts