>  기사  >  백엔드 개발  >  PHP에서 권한 토큰을 설정하는 방법

PHP에서 권한 토큰을 설정하는 방법

藏色散人
藏色散人원래의
2020-08-20 10:13:002633검색

PHP에서 토큰을 설정하는 방법: 1. 토큰을 얻기 위한 라우팅 경로를 정의합니다. 2. 서비스 계층을 설정합니다. 3. UserToken 클래스를 사용하여 전체 로직을 처리합니다. 5. 유효성 검사기 클래스 및 예외 클래스에서는 해당 확인 방법과 예외 처리를 생성합니다.

PHP에서 권한 토큰을 설정하는 방법

권장: "PHP Video Tutorial"

PHP_Set Permission Token Token

우리가 개발한 백엔드 API 인터페이스에는 방문자에 대한 권한 요구 사항이 있습니다(예: 개인 정보가 포함된 일부 인터페이스에는 다음이 필요합니다). 방문자는 인터페이스를 요청함과 동시에 방문자에게 미리 발급된 토큰을 전달합니다.

이것은 토큰과 같습니다. 방문자가 이를 보여줄 경우에만 방문자를 "통과"합니다.

다음은 권한 토큰에 대한 코드 작성 아이디어에 대한 기록입니다.


1. 프로세스 개요

  • 토큰을 얻기 위한 라우팅 경로를 정의하고 코드 매개변수를 수락합니다. (코드 소스: WeChat 서버, 로그인 시스템은 WeChat 시스템 기반)

  • 서비스 계층을 구축하고 이 레이어에 토큰 기본 클래스를 생성하고 UserToken 클래스

  • UserToken 클래스는 전체 로직을 처리합니다: 토큰 생성 및 반환

  • 모델 레이어에 사용자 데이터 테이블을 읽고 쓰는 일을 담당하는 User 클래스를 설정합니다. 서비스 계층의 UserToken 호출에 대해

  • 유효성 검사기 클래스 및 예외 클래스에서 해당 확인 방법 및 예외 처리를 생성합니다.

  • 컨트롤러->서비스 계층->모델 계층이 서비스 계층에 값을 반환합니다.->서비스 계층이 반환합니다. 값을 컨트롤러에 전달하고 전체 프로세스는 토큰 토큰 쓰기를 완료합니다

2. 특정 지침

먼저 라우팅 경로를 정의합니다:

Route::post(
    'api/:version/token/user',
    'api/:version.Token/getToken'
);

그런 다음 토큰 컨트롤러를 만들고 라우팅 경로에 해당하는 getToken 메서드를 정의합니다.

public function getToken($code='') {
        (new TokenGet())->goCheck($code); // 验证器
        $token = (new UserToken($code))->get();
        return [
            'token' => $token
        ];
    }

서비스 레이어를 호출하기 전에 전달된 매개변수를 확인해야 하므로 유효성 검사기 TokenGet을 정의합니다.

class TokenGet extends BaseValidate
{
    protected $rule = [
      'code' => 'require|isNotEmpty'
    ];

    protected $message = [
        'code' => '需要code才能获得Token!'
    ];
 }

토큰 컨트롤러로 돌아갑니다. 확인이 통과되면 서비스 레이어에서 정의한 UserToken 클래스를 호출합니다.

$token = (new UserToken($code))->get();复制代码

여기서는 서비스 레이어와 모델 레이어에 대해 논의해 보겠습니다. 우리의 일반적인 이해는 서비스 계층이 모델 계층을 기반으로 하는 추상 캡슐화라는 것입니다.

  • 모델 계층은 데이터베이스를 운영하고 이를 서비스 계층으로 반환하는 역할만 담당합니다
  • 그런 다음 서비스 계층은 비즈니스 로직을 처리하고 최종적으로 컨트롤러 계층으로 반환합니다

하지만 소규모 프로젝트의 경우 서비스는 일부 간단한 인터페이스 모델 레이어는 컨트롤러에 직접 연결될 수 있기 때문에 실제로는 Model과 약간 비슷합니다. 사용자 권한과 같은 상대적으로 복잡한 인터페이스만 서비스 레이어를 통해 다양한 기능에 대한 코드를 분리할 수 있습니다.

이런 종류의 처리는 훨씬 더 유연합니다. 정말 간단한 인터페이스가 많이 있으며 서비스 계층을 한 번 거칠 필요가 없습니다. 이는 동작을 수행하는 것과 비슷하며 의미가 없습니다.

서비스 계층의 코드 작성으로 돌아가서 다양한 유형의 토큰이 있으므로 먼저 몇 가지 공통 메서드가 포함된 토큰 기본 클래스를 만듭니다. 그런 다음 방문자에게 토큰을 반환하는 UserToken 클래스가 준비됩니다.

WeChat을 기반으로 하기 때문에 code, appid, appsecret의 세 가지 정보가 필요하며 생성자를 통해 UserToken 클래스에 초기 값을 할당합니다.

function __construct($code) {
    $this->code = $code;
    $this->wxAppID = config('wx.app_id');
    $this->wxAppSecret = config('wx.app_secret');
    $this->wxLoginUrl = sprintf(
        config('wx.login_url'),
        $this->wxAppID, $this->wxAppSecret, $this->code
    );
    }

그런 다음 이 세 가지 정보를 인터페이스의 매개변수 위치에 넣습니다. WeChat에서 제공하는 목적은 완전한 WeChat 서버 측 URL을 얻고 필요한 openid를 요청하는 것입니다.

그런 다음 여기에서는 네트워크 요청을 보내는 단계를 건너뜁니다. WeChat 서버는 openid가 포함된 객체를 반환합니다. 이 객체의 값이 괜찮다고 판단한 후, grantToken() 함수를 생성합니다.

private function grantToken($openidObj) {

        // 取出openid
        $openid = $openidObj['openid'];
        
        // 通过Model层调用数据库,检查openid是否已经存在
        $user = UserModel::getByOpenID($openid);
        
        // 如果存在,不处理,反之则新增一条user记录
        if ($user) {
            $uid = $user->id;
        } else {
            // 不存在,生成一条数据,具体方法略过
            $uid = $this->newUser($openid); 
        }
        
        // 生成令牌,写入缓存(具体方法见下面的定义)
        $cachedValue = $this->prepareCacheValue($openidObj, $uid);
        $token = $this->saveToCache($cachedValue);
        
        // 令牌返回到调用者端
        return $token;
}

private function prepareCacheValue($openidObj, $uid) {
    $cachedValue = $openidObj;
    $cachedValue['uid'] = $uid;
    $cachedValue['scope'] = 16; // 权限值,自己定义
    return $cachedValue;
}
    
private function saveToCache($cachedValue) {
    $key = self::generateToken(); // 生成令牌的方法
    $value = json_encode($cachedValue);
    $tokenExpire = config('setting.token_expire'); // 设定的过期时间

    $request = cache($key, $value, $tokenExpire);
        if (!$request) {
            throw new TokenException([
            'msg' => '服务器缓存异常',
            'errorCode' => 10005
        ]);
    }
    return $key; // 返回令牌:token
}

보시다시피 핵심 프로세스는 다음과 같습니다.

  • openid 가져오기
  • 데이터베이스를 확인하고 openid가 이미 존재하는지 확인하세요
  • 존재하는 경우 처리되지 않습니다. 그렇지 않으면 새 사용자 레코드가 추가됩니다.
  • 토큰 생성, 캐시 데이터 준비, 쓰기 캐시
  • 클라이언트에게 토큰을 반환합니다

generateToken() 메서드는 다음과 같이 자세히 정의됩니다. generateToken()这个方法详细定义如下:

public static function generateToken() {
    $randomChars = getRandomChars(32); // 32个字符组成一组随机字符串
    $timestamp = $_SERVER['REQUEST_TIME_FLOAT'];  
    $salt = config('security.token_salt'); // salt 盐
    // 拼接三组字符串,进行MD5加密,然后返回
    return md5($randomChars.$timestamp.$salt);
}
    
function getRandomChars($length) {
    $str = null;
    $strPoll = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $max = strlen($strPoll) - 1;

    for ($i = 0; $i < $length; $i++) {
        $str .= $strPoll[rand(0, $max)];
    }
    return $str;
}

它的主要作用毫无疑问就是生成我们的需要的令牌——Token字符串。值得一提的是由于generateToken()在其他类型的Token里也会用到,所以是放在Token基类里的。

至此,只需要把生成的令牌再返回到Controller就行了。

三、总结

令牌的编写涉及到很多的流程,为了避免混乱,一定要注意把负责不同工作的代码分别定义在不同的方法里。就像上面例子里grantToken()方法体现的那样,这是个核心方法,包含所有流程,但是不同的具体流程又定义在其他方法里,然后提供给grantToken()方法调用。

这样做之后grantToken()rrreee

주요 기능은 의심할 여지 없이 필요한 토큰인 토큰 문자열을 생성하는 것입니다. generateToken()은 다른 유형의 토큰에도 사용되므로 Token 기본 클래스에 배치된다는 점을 언급할 가치가 있습니다. 🎜🎜이 시점에서는 생성된 토큰만 컨트롤러에 반환하면 됩니다. 🎜

3. 요약 🎜🎜토큰 작성에는 많은 프로세스가 포함됩니다. 혼동을 피하기 위해 다양한 작업을 담당하는 코드를 다른 방법으로 정의해야 합니다. . 위 예시의 grantToken() 메소드와 같이 모든 프로세스를 포함하는 핵심 메소드이지만, 다른 특정 프로세스는 다른 메소드에서 정의한 후 grantToken() 메서드 호출. 🎜🎜이 작업을 수행한 후에도 <code>grantToken() 메서드는 모든 프로세스가 포함되어 있음에도 여전히 읽기 쉽습니다. 🎜

위 내용은 PHP에서 권한 토큰을 설정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.