last Update : 2019.9.2
사용자 기기의 고유 토큰 정보를 획득하는 방법이 변경되었다.
// 사용자 기기의 고유 토큰 정보를 획득 FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( Login.this, new OnSuccessListener<InstanceIdResult>() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { newToken = instanceIdResult.getToken(); Log.e("newToken",newToken);
} });
Button submit = (Button) findViewById(R.id.login_btn); submit.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View view) { loginID = etId.getText().toString().trim(); loginPW = etPw.getText().toString().trim();
if (loginID != null && !loginID.isEmpty() && loginPW != null && !loginPW.isEmpty()) { Uri.Builder builder = new Uri.Builder() .appendQueryParameter("loginID", Value.encrypt(loginID)) .appendQueryParameter("loginPW", Value.encrypt(loginPW)) .appendQueryParameter("uID", Value.encrypt(Value.getPhoneUID(context))) .appendQueryParameter("AppVersion", Value.VERSION) .appendQueryParameter("phoneVersion", Build.VERSION.RELEASE) .appendQueryParameter("phoneBrand", Build.BRAND) .appendQueryParameter("phoneModel", Build.MODEL) .appendQueryParameter("mfoneNo", Value.encrypt(getPhoneNumber())) .appendQueryParameter("tokenID", newToken) .appendQueryParameter("keyword", Value.encrypt(Value.URLkey())); String urlParameters = builder.build().getEncodedQuery();
new AsyncLogin().execute(Value.IPADDRESS + "/loginChk.php", urlParameters); } } });
|
========================================================================
Update : 2017.9.2
안드로이드 스튜디오에서 FCM 관련 코드를 구현했으면 이제 구글에서 생성해주는 토큰을 PHP 서버에 등록해야 한다.
토큰(Token)을 등록하는 방법은 로그인 정보에 같이 포함해서 보내는 것이 가장 편리하다.
// 단말기의 ID 정보를 얻기 위해서는 READ_PHONE_STATE 권한이 필요 TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); if (mTelephony.getDeviceId() != null){ uID = mTelephony.getDeviceId(); // 스마트폰 기기 정보 } else { uID = Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID); }
// 사용자 기기의 고유 토큰 정보를 획득 String getToken = FirebaseInstanceId.getInstance().getToken();
System.out.println("DeviceID : " + uID); System.out.println("Intro Token : " + getToken);
// 전달할 인자들 String keyword = Value.URLkey(); Uri.Builder builder = new Uri.Builder() .appendQueryParameter("loginID", Value.encrypt(params[0])) .appendQueryParameter("loginPW", Value.encrypt(params[1])) .appendQueryParameter("uID", Value.encrypt(uID)) .appendQueryParameter("phoneVersion", Build.VERSION.RELEASE) .appendQueryParameter("phoneBrand", Build.BRAND) .appendQueryParameter("phoneModel", Build.MODEL) .appendQueryParameter("tokenID", getToken) .appendQueryParameter("keyword", Value.encrypt(Value.URLkey())); String urlParameters = builder.build().getEncodedQuery(); |
토큰에 대한 정보를 획득하여 로그인하면서 서버로 전송하면 된다.
이제 PHP 서버에서는 이 정보를 사용자 DB에 저장해야 한다.
loginChk.php 파일에서 안드로이드 접속 인증 체크를 한다고 가정하자.
loginID, loginPW 인증에 성공하면
// 토큰 등록 및 갱신
if(isset($tokenID) && strlen($tokenID) > 63){
$c->registerToken($tokenID,$loginID,$deviceID); // DB에 토큰 저장
}
함수를 포함시켜서 DB에 토큰 정보가 저장되고 Update 되도록 한다.
아래 코드는 토큰 저장에 필요한 함수만 발췌했다.
<?php class TokenClass { // 토큰 등록 및 갱신 function registerToken($token,$userID,$deviceID){ global $dbconn; $rs = $this->getDeviceChk($userID,$deviceID); // memberuid 또는 0 if($rs > 0 ){ $gettokenID = $this->getTokenIDChk($rs); // 0 또는 DB 등록 토큰 반환 if(($gettokenID == '0') || ($gettokenID !== $token)){ // 등록안되었거나 토큰 불일치 $sql ="UPDATE member_data SET tokenID='".$token."'"; $sql.=" where memberuid='".$rs."'"; if($result = mysqli_query($dbconn,$sql)){ return 1; } else { return 0; } } } }
function getTokenIDChk($rs){ global $dbconn; $sql ="select tokenID from member_data where memberuid='".$rs."'"; if($result = mysqli_query($dbconn,$sql)){ $row = mysqli_fetch_row($result); if($row[0] == NULL){ return 0; } else { return $row[0]; } } else { return 0; } }
function getDeviceChk($userID,$deviceID){ global $dbconn; // 사용자 기준 장치 정보 검사 $sql ="select count(phoneID),memberuid from member_data"; $sql.=" where memberuid=(select uid from member_id where id='".$userID."') and phoneID='".$deviceID."'"; if($result = mysqli_query($dbconn,$sql)){ $row = mysqli_fetch_row($result); if($row[0] == 1){ return $row[1]; // 있으면 memberuid 반환 } else { return $row[0]; } } else { return 0; } }
}//end class ?> |
DB 테이블 구조
테이블 구조는 참조하여 필요한 것만 발췌하여 이용하면 된다.
member_id.uid = member_data.memberuid
CREATE TABLE IF NOT EXISTS `member_data` (
`memberuid` int(11) NOT NULL,
`site` int(11) NOT NULL DEFAULT '0',
`auth` tinyint(4) NOT NULL DEFAULT '0',
`level` int(11) NOT NULL DEFAULT '0',
`admin` tinyint(4) NOT NULL DEFAULT '0',
`email` varchar(50) NOT NULL DEFAULT '',
`name` varchar(30) NOT NULL DEFAULT '',
`nic` varchar(50) NOT NULL DEFAULT '',
`grade` varchar(20) NOT NULL DEFAULT '',
`photo` varchar(200) NOT NULL DEFAULT '',
`sex` tinyint(4) NOT NULL DEFAULT '0',
`officeNO` varchar(14) NOT NULL DEFAULT '',
`mobileNO` varchar(14) NOT NULL DEFAULT '',
`num_login` int(11) NOT NULL DEFAULT '0',
`d_regis` varchar(14) NOT NULL DEFAULT '',
`tokenID` varchar(200) DEFAULT NULL,
`phoneID` varchar(60) DEFAULT NULL,
`phoneVersion` varchar(20) DEFAULT NULL,
`phoneBrand` varchar(20) DEFAULT NULL,
`phoneModel` varchar(20) DEFAULT NULL,
PRIMARY KEY (`memberuid`),
KEY `site` (`site`),
KEY `auth` (`auth`),
KEY `level` (`level`),
KEY `admin` (`admin`),
KEY `email` (`email`),
KEY `name` (`name`),
KEY `nic` (`nic`),
KEY `sex` (`sex`),
KEY `d_regis` (`d_regis`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `member_id` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`site` int(11) NOT NULL DEFAULT '0',
`id` varchar(50) NOT NULL DEFAULT '',
`pw` varchar(50) NOT NULL DEFAULT '',
`code` int(6) NOT NULL DEFAULT '0',
`admin` int(2) NOT NULL DEFAULT '0',
PRIMARY KEY (`uid`),
UNIQUE KEY `id` (`id`),
KEY `code` (`code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;