php auth 认证原理,ThinkPHP5中使用 Auth2进行验证的过程分析

本篇文章给大家分享的内容是关于ThinkPHP5中使用 Auth2进行验证的过程分析,有需要的朋友可以参考一下,希望能帮助到大家。

在tp上实现的auth2验证的,在网上发现笔记很少, 不像yii, 故在此发表一下笔记,用来帮助有相关需求的朋友

PS: 鉴于oauth2有四种方案, 本实例是基于 客户端凭证 实现,其他三种就不讲述了

一、通过composer安装

composer require --prefer-dist bshaffer/oauth2-server-php

安装完成后,如图:

6c760ce59fa6b6a50688ec52d135d94e.png

会出现相关的目录

二、实现授权文件

1) 创建对应的数据表

首先找到 Pdo.php文件,如图:

bf57c0ecf2fc4252b4da719603bede87.png

然后找到该位置

ab66c8a4eb8d26fe6bc7cb0e7278abab.png

目的,是告诉你创建表时的名称,应该和这里使用的表名称一致

关于创建的表,我直接上代码,方便各位可以直接复制粘贴:CREATE TABLE

oauth_access_tokens

(

access_token

varchar(40) NOT NULL,

client_id

varchar(80) NOT NULL,

user_id

int(11) DEFAULT NULL,

expires

varchar(19) NOT NULL,

scope

text,

PRIMARY KEY (

access_token

),

KEY

fk_access_token_oauth2_client_client_id

(

client_id

),

KEY

ix_access_token_expires

(

expires

),

CONSTRAINT

fk_access_token_oauth2_client_client_id

FOREIGN KEY (

client_id

) REFERENCES

pos_oauth2_client

(

client_id

) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE

oauth_authorization_codes

(

authorization_code

varchar(40) NOT NULL,

client_id

varchar(80) NOT NULL,

user_id

int(11) DEFAULT NULL,

redirect_uri

text NOT NULL,

expires

int(11) NOT NULL,

scope

text,

PRIMARY KEY (

authorization_code

),

KEY

fk_authorization_code_oauth2_client_client_id

(

client_id

),

KEY

ix_authorization_code_expires

(

expires

),

CONSTRAINT

fk_authorization_code_oauth2_client_client_id

FOREIGN KEY (

client_id

) REFERENCES

pos_oauth2_client

(

client_id

) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE

oauth_clients

(

client_id

varchar(80) NOT NULL,

client_secret

varchar(80) NOT NULL,

redirect_uri

text NOT NULL,

grant_type

text,

scope

text,

created_at

int(11) DEFAULT NULL,

updated_at

int(11) DEFAULT NULL,

created_by

int(11) DEFAULT NULL,

updated_by

int(11) DEFAULT NULL,

PRIMARY KEY (

client_id

)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE

oauth_refresh_tokens

(

refresh_token

varchar(40) NOT NULL,

client_id

varchar(80) NOT NULL,

user_id

int(11) DEFAULT NULL,

expires

int(11) NOT NULL,

scope

text,

PRIMARY KEY (

refresh_token

),

KEY

fk_refresh_token_oauth2_client_client_id

(

client_id

),

KEY

ix_refresh_token_expires

(

expires

),

CONSTRAINT

fk_refresh_token_oauth2_client_client_id

FOREIGN KEY (

client_id

) REFERENCES

pos_oauth2_client

(

client_id

) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE

oauth_scopes

(

scope

text,

is_default

tinyint(1) DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

添加一条数据insert into

oauth_clients

(

client_id,

client_secret,

redirect_uri,

grant_type,

scope,

created_at,

updated_at,

created_by,

updated_by

) values ('admin','123456','http://','client_credentials',NULL,NULL,NULL,NULL,NULL);

PS,说明一下,如图:

5648dc6dc8ea61dea85893e1af3bdf52.png

在我实际使用中,只使用到这五张表,也就是上面创建的五张表,在这个config里面,剩下的几个选项我是全部 注销掉了的

另外还有一个情况,说明一下: 有可能各位,对数据表设置了表前缀, 也是需要在此进行相关修改的, 比如我创建的,见图:

a9096395f92d1e968473d012352177c8.png

所以我进行了相关的修改:

b291b18ea02ded9bc0c1441465a4c14c.png

2) 创建授权文件 Oauth2.php, 名字随便自己取<?phpnamespace appcommon;/**

@author jinyan

@create 20180416

*/use OAuth2StoragePdo;use thinkConfig;

class Oauth2{/**

* @Register new Oauth2 apply

* @param string $action

* @return boolean|\OAuth2\Server

*/

function grantTypeOauth2($action=null)

{

Config::load(APP_PATH.'database.php');

$storage = new Pdo(

[

'dsn' => config('dsn'),

'username' => config('username'),

'password' => config('password')

]

);

$server = new \OAuth2\Server($storage, array('enforce_state'=>false));

// Add the "Client Credentials" grant type (it is the simplest of the grant types)

$server->addGrantType(new \OAuth2\GrantType\ClientCredentials($storage));

// Add the "Authorization Code" grant type (this is where the oauth magic happens)

$server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($storage));

// Add the "User Credentials" grant type (this is where the oauth magic happens)

$server->addGrantType(new \OAuth2\GrantType\UserCredentials($storage));

return $server;

}

/**

* @校验token值

* @param unknown $server

*/

protected function checkApiAuthroize($server)

{

if (!$server->verifyResourceRequest(\OAuth2\Request::createFromGlobals())) {

$server->getResponse()->send();

exit;

}

}}

?>

3) 创建token文件, Access.php<?phpnamespace apprestfulcontroller;use appcommonOauth2;

/**

@uathor:jinyan

*/

class Access extends Oauth2{protected $_server;

/**

* @授权配置

*/

public function __construct()

{

return $this->_server = $this->grantTypeOauth2();

}

/**

*

*/

private function _token()

{

// Handle a request for an OAuth2.0 Access Token and send the response to the client

$this->_server->handleTokenRequest(\OAuth2\Request::createFromGlobals())->send('json', 'oauth2_');

}

/**

* @get access_token

*/

public function access_token()

{

$this->_token();

}}

?>

那么如何请求一个access_token的值呢? 直接调用这个 acccess_token()的方法即可

request url: http://restful.thinkphp.com/r...

还请得之前创建数据表时,有添加了一条新数据吗? 其作用就是相当于用来获取access_token的账号密码之类的, 记得需要使用 Post方式获取token

请求的参数{

client_id=admin

client_secret=123456

grant_type=client_credentials //这个参数是固定的

}

如果请求成功的话,会返回如下图所示:

39e3c3551ee2f9a97da55aacd024c61b.png

贴上,通过ff浏览器httprequest的请求界面:

43d48ca5d1fc4db3f005b9533f025da8.png

4) 通过 access_token 获取接口数据 ,Sms.php<?php

namespace apprestfulcontroller;

/**

Created by PhpStorm.

User: Administrator

Date: 2018/7/29

Time: 22:02

*/

use appcommonOauth2;

class Sms extends Oauth2

{

protected $_server;

/**

* @授权配置

*/

public function __construct()

{

$this->_server = $this->grantTypeOauth2();

}

public function test()

{

//access_token验证

$this->checkApiAuthroize($this->_server);

echo '成功请求到数据';

}

}

三、 测试效果如图:

1)首先不带access_token请求, test()方法:

30cde689201e9c79caf3e17aacb9ed13.png

结果出现一个401未验证通过的状态

2)然后请求一个错误的access_token, test()方法

7fe7bd62411dbd2cece1d01a95a5da77.png

同样是一个401的状态,但此时,如图

29a415e9d2793cd33fcac31d1751e928.png

有信息返回给我们

3) 最后,使用一个正确的access_token, test()方法

1452d318f33797a9a39babc9a5b92137.png

所以,基于第1种情况和第2种情况,你应该自定一个token未验证成功的方法,如图:

7dcf9d3e695ceb3ec4db8308bde1b5e5.png

477480e75ff0ed80bf5dd55571c85337.png

32f808dff9e733dd0dcde070b7d49514.png

a527f3f5a65c7704ddf81da00c47f65d.png

完结。

相关文章推荐:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值