이 기사에서는 PHP로 고가용성 및 보안 수준이 높은 앱 백엔드를 개발하는 방법에 대한 연구 노트를 공유합니다. 도움이 필요한 친구는 기사 내용을 참조할 수 있습니다.
소스 코드 다운로드 주소: https://download.csdn.net/ download/qq_21683643 /10331534
Directory
1.보안
2.인증 코드 서명 알고리즘
3.로그인 시나리오 access_user_token 알고리즘
4.토큰 고유성 지원
5.API 일회성 요청 지원
6.고가용성
7. 편안한 API
8. 웹 로그인과 앱 로그인의 유사점과 차이점
9. Alibaba SMS 확인으로 복잡한 클라이언트 앱 로그인 시나리오 해결
10. API 인터페이스 버전 솔루션
11. 앱 로컬 시간 및 서버 시간 일관성 솔루션
12. 예측할 수 없는 API 내부 예외 솔루션
13. APP 버전 업그레이드 계획
14. 기본 이미지 처리 서비스 기능을 해결하려면
15. PHP 디자인 패턴 침투
17. 최고의 솔루션을 선택하세요
18. PHP와 ajax 간의 비동기 데이터 상호작용
1. Restful api 데이터 구조 형식
3. HTTP 상태 코드는 TK의 자체 json을 사용하여 구현됩니다.
3. 상태 비즈니스 상태 코드
4. 메시지 프롬프트 메시지
5. 데이터 데이터 계층
범용 API 인터페이스 데이터 캡슐화
function show($status, $message, $data=[], $httpCode=200) { $data = [ 'status' => $status, 'message' => $message, 'data' => $data, ]; return json($data, $httpCode); }예측할 수 없는 내부 예외 API 데이터 출력 솔루션
예외 클래스 경로를 채우도록 예외 핸들 구성 구성
class ApiHandleException extends Handle { /** * http 状态码 * @var int */ public $httpCode = 500; public function render(\Exception $e) { // 还原正常报错,上线后为flase(服务端开发) if(config('app_debug') == true) { return parent::render($e); } if ($e instanceof ApiException) { $this->httpCode = $e->httpCode; } return show(0, $e->getMessage(), [], $this->httpCode); } }class ApiException extends Exception { public $message = ''; public $httpCode = 500; public $code = 0; /** * @param string $message * @param int $httpCode * @param int $code */ public function __construct($message = '', $httpCode = 0, $code = 0) { $this->httpCode = $httpCode; $this->message = $message; $this->code = $code; } }
2. APP-API 데이터 보안 솔루션다양함 암호화: MD5 AES(대칭 암호화) RSA(비대칭, 저효율)
sign(유효 시간, 고유성)
/** * 生成每次请求的sign * @param array $data * @return string */ public static function setSign($data = []) { // 1 按字段排序 ksort($data); // 2拼接字符串数据 & $string = http_build_query($data); // 3通过aes来加密 $string = (new Aes())->encrypt($string); return $string; }/** * 检查sign是否正常 * @param array $data * @param $data * @return boolen */ public static function checkSignPass($data) { $str = (new Aes())->decrypt($data['sign']); if(empty($str)) { return false; } // diid=xx&app_type=3 parse_str($str, $arr); if(!is_array($arr) || empty($arr['did']) || $arr['did'] != $data['did'] ) { return false; } // 有效时间:时间间隔不能超过60s if(!config('app_debug')) { if ((time() - ceil($arr['time'] / 1000)) > config('app.app_sign_time')) { return false; } //echo Cache::get($data['sign']);exit; // 唯一性判定 if (Cache::get($data['sign'])) { return false; } } return true; }/** * 检查每次app请求的数据是否合法 */ public function checkRequestAuth() { // 首先需要获取headers $headers = request()->header(); // todo // sign 加密需要 客户端工程师 , 解密:服务端工程师 // 1 headers body 仿照sign 做参数的加解密 // 2 // 3 // 基础参数校验 if(empty($headers['sign'])) { throw new ApiException('sign不存在', 400); } if(!in_array($headers['app_type'], config('app.apptypes'))) { throw new ApiException('app_type不合法', 400); } // 需要sign if(!IAuth::checkSignPass($headers)) { throw new ApiException('授权码sign失败', 401); } Cache::set($headers['sign'], 1, config('app.app_sign_cache_time')); // 1、文件 2、mysql 3、redis $this->headers = $headers; }APP 및 서버 측 시간 일관성 솔루션
해결책 1: 서버 측 시간을 가져오고 클라이언트는 비교를 위해 서버에서 정확한 시간을 확인하세요.
해결책 2: 앱 초기화 시 타임스탬프 전송, 클라이언트 시간 = 서버 타임스탬프 + 차이
3. API 인터페이스 문서 작성(API 입력 매개변수, 출력 매개변수 형식) API 인터페이스 주소 요청 방법 사후 입력 매개변수 형식 출력 매개변수 형식 http code
4. APP 버전 업그레이드 사업 개발 테이블 디자인
CREATE TABLE ent_version
( id
int(10) unsigned NOT NULL, ent_version
( id
int(10) unsigned NOT NULL, app_type
varchar(20) NOT NULL DEFAULT ” COMMENT ‘app类型 比如 ios android’, version
int(8) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘内部版本号’, version_code
varchar(20) NOT NULL DEFAULT ” COMMENT ‘外部版本号比如1.2.3’, is_force
tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘是否强制更新0不,1强制更新’, apk_url
varchar(255) NOT NULL DEFAULT ” COMMENT ‘apk最新地址’, upgrade_point
varchar(500) NOT NULL DEFAULT ” COMMENT ‘升级提示’, status
tinyint(1) NOT NULL DEFAULT ‘0’ COMMENT ‘状态’, create_time
int(10) unsigned NOT NULL DEFAULT ‘0’, update_time
int(10) unsigned NOT NULL DEFAULT ‘0’
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
5、登录开发
1.1APP登录业务开发介绍
一般app有两种状态:登录态和未登录态
为什么要做登录?挖掘用户、互动、交流
如何做APP登录?模仿其他App登录
其他登录方式:免密手机号验证码、账号密码
第三方登录方式:qq授权、微信授权、微博授权
1.2App登录表结构的设计
CREATE TABLE ent_user
( id
int(10) unsigned NOT NULL COMMENT ‘主键’, username
varchar(20) NOT NULL DEFAULT ” COMMENT ‘用户名’, password
char(32) NOT NULL DEFAULT ” COMMENT ‘密码’, phone
varchar(11) NOT NULL DEFAULT ” COMMENT ‘手机号’, token
varchar(100) NOT NULL DEFAULT ” COMMENT ‘令牌’, time_out
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘令牌失效时间’, image
varchar(200) NOT NULL DEFAULT ” COMMENT ‘头像’, sex
tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘性别0男 1女’, signature
varchar(200) NOT NULL DEFAULT ” COMMENT ‘个性签名’, create_time
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘注册时间’, update_time
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘登录时间’, status
app_type code> varchar(20) NOT NULL DEFAULT ” COMMENT 'ios android 등 앱 종류', <br><code>version
int(8) unsigned NOT NULL DEFAULT '0' COMMENT '내부 버전 번호', version_code
varchar(20) NOT NULL DEFAULT ” COMMENT '1.2.3과 같은 외부 버전 번호', is_force
tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '할지 여부 강제 업데이트 0 여부, 1 강제 업데이트', apk_url
varchar(255) NOT NULL DEFAULT ” COMMENT 'apk 최신 주소', upgrade_point
varchar(500) NOT NULL DEFAULT ” COMMENT '업그레이드 프롬프트',
status
tinyint(1) NOT NULL DEFAULT '0' COMMENT 'status', 🎜create_time
int(10) unsigned NOT NULL DEFAULT '0', 🎜update_time
int(10) unsigned NOT NULL DEFAULT '0' 🎜) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 🎜🎜5. 로그인 개발🎜 🎜1.1APP 로그인 사업 소개 개발에 🎜 일반적으로 앱에는 로그인 상태와 로그인 해제 상태라는 두 가지 상태가 있습니다. 🎜 로그인이 필요한 이유는 무엇인가요? 사용자를 발견하고 상호작용하고 소통하세요. 🎜APP에 로그인하는 방법은 무엇인가요? 다른 앱 로그인 모방🎜기타 로그인 방법: 무비밀번호 휴대폰 번호 인증코드, 계정 비밀번호🎜타사 로그인 방법: QQ 인증, WeChat 인증, Weibo 인증🎜1.2 앱 로그인 테이블 구조 설계🎜CREATE TABLE ent_user ( 🎜<code>id
int(10) unsigned NOT NULL COMMENT '기본 키', 🎜username
varchar(20) NOT NULL DEFAULT ” COMMENT 'username', 🎜password char(32) NOT NULL DEFAULT ” COMMENT 'password', 🎜phone
varchar(11) NOT NULL DEFAULT ” COMMENT '휴대폰번호', 🎜token varchar(100) NOT NULL DEFAULT ” COMMENT 'Token', 🎜<code>time_out
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '토큰 만료 시간', 🎜image code> varchar(200) NOT NULL DEFAULT ” COMMENT 'avatar', 🎜<code>sex
tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Sex 0 남성 1 여성', 🎜signature varchar(200) NOT NULL DEFAULT ” COMMENT '개인 서명', 🎜<code>create_time
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '등록 시간', 🎜update_time code> int(10) unsigned NOT NULL DEFAULT '0' COMMENT '로그인 시간', 🎜<code>status
tinyint(1) NOT NULL DEFAULT '0' COMMENT '상태가 잠겨 있습니다' 🎜) ENGINE=InnoDB DEFAULT CHARSET=utf8; 🎜1.3 Alibaba 클라우드 통신 서비스 플랫폼 소개 🎜Alibaba란 무엇입니까 🎜Alibaba는 SMS, 음성 및 기타 서비스를 포함한 맞춤형 서비스를 제공합니다 🎜1.4 SMS 인증 코드 전송 기능 개발 🎜1.5앱 로그인 토큰 고유성 알고리즘
앱이 로그인을 호출하면 서버는 암호화된 토큰 정보를 반환합니다. 앱이 인터페이스를 요청할 때마다 토큰을 가져와야 합니다.
앱이 고유한 토큰을 생성하고 암호화합니다. 토큰=토큰+13자리 timestamp
1.6App 비밀번호로 로그인
사용자 이름과 비밀번호를 모두 암호화하여 서버로 전송해야 합니다
6. APP 측 예외, 성능 모니터링 및 위치 분석
APP 측 예외의 기본 상황:
Crach 앱 사용 중 갑작스러운 크래시 발생
화면 끊김 현상 발생
프로그램 이상 발생
ANR 무응답 팝업창 발생 (안드로이드)
데이터 수집 방안 :
예외 성능표 구축 및 API 인터페이스 개발
id 기본 키
app_type 앱 유형
version_code 버전 번호
모델 장치 모델
Did 장치 ID
type 예외 유형
설명 설명
Line 오류 줄 수
create_time 생성 시간
성숙한 솔루션:
타사 플랫폼을 사용하고 앱 클라이언트는 다음과 같은 통계 데이터용 SDK에 액세스할 수 있습니다: Umeng Statistics
7. APP 메시지 푸시 서비스 솔루션
폴링 방법: APP는 정기적으로 서버에 http 요청을 보내 메시지가 있는지 확인합니다.
타사 플랫폼 : 서버->타사 플랫폼->앱
관련 권장 사항:
위 내용은 고가용성 및 높은 보안 앱 백엔드의 PHP 개발 연구 노트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!