在接口开发中一般使用传统的Token
来验证访问的有效性,但是这种方式非常容易被攻击,当Token
被拦截后相当于接口对外开放了,所以需要一种更安全的接口认证方式。
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。
下面将介绍如何使用插件 OAuth2.0 服务端
处理你的 API 认证。
注意: php版本需要在 7.1
以上。
第一步,下载插件。
插件主页:https://www.fastadmin.net/store/oauth.html
优惠券:https://www.fastadmin.net/coupon/5O3W.html
第二步,安装扩展库
composer require league/oauth2-server
建议使用php7.3以上的版本
php7.2、7.3请使用 JWT3.4.6
composer require lcobucci/jwt:3.4.6
第三步,创建 private key
和 public key
:
openssl genrsa -out private.key 2048openssl rsa -in private.key -pubout > public.key
private key
和public key
放到项目主目录下
第四步,用户模型使用Trait WeasyOauthApiTokens
用户模型我们使用 fastadmin
的用户模型 appcommonmodelUser
,如下:
<?phpnamespace appcommonmodel;use thinkModel;// 导入 Traituse WeasyOauthApiTokens;/** * 会员模型 */class User extends Model{ // 使用 ApiTokens Trait use ApiTokens; // 开启自动写入时间戳字段 protected $autoWriteTimestamp = 'int'; // 定义时间戳字段名 protected $createTime = 'createtime'; protected $updateTime = 'updatetime'; ... ...}
第五步,创建控制器
在 application/api/controller
下创建控制器 Test.php
:
<?phpnamespace appapicontroller;use WeasyOauthCheckCredentials;use appcommoncontrollerApi;/** * 接口 */class Test extends Api{ // 这里使用控制器中间件鉴权 use CheckCredentials; protected $noNeedLogin = '*'; protected $noNeedRight = '*'; // index 不需要鉴权 protected $noNeedCheck = 'index'; /** * 初始化,验证 access_token */ public function _initialize() { parent::_initialize(); // 验证 access_token $this->handle(); } public function index() { $this->success("你访问的是 index 接口"); } public function show() { $this->success("你访问的是 show 接口"); } public function delete() { $this->success("你访问的是 delete 接口"); }}
测试
创建密码授权客户端
首先我们进入 http://localhost/addons/oauth/clients
创建一个密码客户端,我用的本地测试,将localhost修改为你的服务器地址,客户端创建如下:
创建完成我们拿到 客户端ID
和 客户端秘钥
,也就是OAuth2.0常说的 APP_ID
和 APP_SECRET
,有了这两个就可以获取访问令牌了,如下:
获取访问令牌
在访问受保护的API时我们需要获取 access_token
和 refresh_token
,URI为oauth/token
,我用的本地测试,所以地址是 http://localhost/oauth/token
(或地址 http://localhost/addons/oauth/AccessToken/issueToken
)使用 postman
测试如下:
需要的参数分别是
- 授权类型
grant_type
,值为password
密码授权类型- 客户端ID
client_id
,值为上面获取到的客户端ID- 客户端秘钥
client_secret
,值为上面获取到的客户端秘钥- 用户名
username
,你可以使用fastadmin自带的用户系统创建一个用户- 密码
password
- 授权范围
scope
,如果你需要设定访问范围需加上scope
参数
我们拿到访问令牌 access_token
就可以访问受保护的API了。
index 接口
index
方法不用鉴权就可以访问,使用 postman
测试如下:
show接口
在测试show接口或需要用户进行身份验证的任何 API 时,你需要指定两个标头请求头信息。 你必须在 Authorization
请求头中将 token
指定为 Bearer token
。 基本上,你必须将收到的 access_token
拼到 Bearer 后面,当中空一个空格。
'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '. $accessToken, // Bearer后面有一个空格]
使用 postman
测试如下:
不带 Authorization
头:
带 Authorization
头:
可以看到当我们将 access_token
通过 Bearer token
附加到 Authorization
头上后就可以成功访问 show 接口了。
delete接口
delete方法也是受保护的接口,访问时也和 show 接口一样,测试如下:
刷新令牌
如果你拿到的是一个短期授权令牌或访问令牌过期可以使用 refresh_token
刷新令牌来获取新的访问令牌,示例如下:
其中参数将grant_type
改为refresh_token
,添加参数refresh_token
,值为获取访问令牌时返回的刷新令牌。注意
:刷新令牌refresh_token
只能使用一次,上面的方法会重新发出一个刷新令牌。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。