- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Laravel5.5中利用Passport实现Auth认证的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
最近在写一个前后端分离项目,本来想用 Jwt-auth + Dingo 开发的,但是略感笨重,于是想到了 Laravel 的 Passport 和 5.5 新出的 Api Resource。Laravel Passport 是一套已经封装好的 OAuth2 服务端实现 。
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版.
OAuth 2.0 是目前比较流行的做法,它率先被Google, Yahoo, Microsoft, Facebook等使用。之所以标注为 2.0,是因为最初有一个1.0协议,但这个1.0协议被弄得太复杂,易用性差,所以没有得到普及。2.0是一个新的设计,协议简单清晰,但它并不兼容1.0,可以说与1.0没什么关系.
所以这里就不细说了,先来看看怎么安装它吧.
安装 。
安装 Passport 。
1.在你的 Shell 中执行以下命令 。
1
|
composer
require
laravel/passport
|
如果你使用的 Laravel 版本是 5.5 以下,你需要手动在 config/app.php 文件 providers 数组中加入如下代码 。
1
|
Laravel\Passport\PassportServiceProvider::
class
,
|
2.运行迁移文件 。
在你的 Shell 中执行如下命令 。
1
|
php artisan migrate
|
Passport 服务提供器使用框架注册自己的迁移目录,因此在注册服务后,你可以直接运行 php artisan migrate 来为 Passport 生成所需的数据表 。
3.生成加密密钥 。
在你的 Shell 中执行如下命令 。
1
|
php artisan passport:install
|
此命令会创建生成安全访问令牌时所需的加密密钥,同时,这条命令也会创建用于生成访问令牌的「个人访问」客户端和「密码授权」.
4.添加 Trait 。
将 LaravelPassportHasApiTokens Trait 添加到 AppUser 模型中 。
1
2
3
4
5
6
7
8
9
|
<?php
namespace
App;
use
Laravel\Passport\HasApiTokens;
use
Illuminate\Notifications\Notifiable;
use
Illuminate\Foundation\Auth\User
as
Authenticatable;
class
User
extends
Authenticatable
{
use
HasApiTokens, Notifiable;
}
|
5.注册路由 。
在 AuthServiceProvider 的 boot 方法中调用 Passport::routes 函数.
1
2
3
4
5
6
7
8
|
class
AuthServiceProvider
extends
ServiceProvider
{
public
function
boot()
{
$this
->registerPolicies();
Passport::routes();
}
}
|
如果你的程序是需要前后端分离形式的OAuth认证而不是多平台认证那么你可以在routers()方法中传递一个匿名函数来自定定义自己需要注册的路由,我这里是前后端分离的认证形式,因此我只需要对我的前端一个Client提供Auth的认证,所以我只注册了获取Token的路由,同时我还为它自定义了前缀名.
1
2
3
|
Passport::routes(
function
(RouteRegistrar
$router
) {
$router
->forAccessTokens();
},[
'prefix'
=>
'api/oauth'
]);
|
6.更改看守器驱动 。
将配置文件 config/auth.php 中授权看守器 guards 的 api 的 driver 选项改为 passport。此调整会让你的应用程序在在验证传入的 API 的请求时使用 Passport 的 TokenGuard 来处理 。
1
2
3
4
5
6
7
8
9
10
|
'guards'
=> [
'web'
=> [
'driver'
=>
'session'
,
'provider'
=>
'users'
,
],
'api'
=> [
'driver'
=>
'passport'
,
'provider'
=>
'users'
,
],
],
|
至此 Passport 已经安装完成,剩下的文档里所讲到的前端部分的话,由于我是只需要使用它做 Auth 的认证,并不需要实现完整的 OAuth 功能,所以我们完全可以不使用前端页面.
使用 。
为了 Api 返回数据方便,我封装了几个函数 。
1
2
3
4
5
6
7
8
9
10
11
12
|
function
respond(
$status
,
$respond
)
{
return
response()->json([
'status'
=>
$status
,
is_string
(
$respond
) ?
'message'
:
'data'
=>
$respond
]);
}
function
succeed(
$respond
=
'Request success!'
)
{
return
respond(true,
$respond
);
}
function
failed(
$respond
=
'Request failed!'
)
{
return
respond(false,
$respond
);
}
|
respond 函数可以做基本返回,succeed 和 failed 是在 respond 函数上做的再次封装,用以返回请求成功和请求失败数据.
然后我们需要使用一层代理.
先说一下使用代理的原因,Passport 认证的流程是 从属应用带着 主应用 。
生成的 Client Token 和 用户输入的账号密码去请求主应用的 Passport Token 路由,以获得 access token (访问令牌) 和 refresh token (刷新令牌),然后带着得到的 access token 就可以访问 auth:api 下的路由了。但是我们并没有从属应用,是由前后端分离的前端来请求这个token,如果从前端想来拉取这个 access token 就需要把 Client token 写死在前端里,这样是很不合理的,所以我们可以在内部写一个代理,由应用自身带着 Client token 去请求自身以获取 access token,这样说可能有一点绕,大概请求过程是下面这个样子 。
1.前端带着用户输入的账号密码请求服务端 。
2.服务端带着从前端接收到账号与密码,并在其中添加 Client_id 与 Client_token,然后带着这些参数请求自身的 Passport 认证路由,然后返回认证后的 Access token 与 refresh token 。
下面是代码实现,我在 AppHttpControllersTraits 下新建了一个 ProxyHelpers 的 Trait,当然,这个函数是我根据我的业务逻辑自己封装的,如果不适合你的业务逻辑你可以自行调整.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?php
namespace
App\Http\Controllers\Traits;
use
GuzzleHttp\Client;
use
App\Exceptions\UnauthorizedException;
use
GuzzleHttp\Exception\RequestException;
trait ProxyHelpers
{
public
function
authenticate()
{
$client
=
new
Client();
try
{
$url
= request()->root() .
'/api/oauth/token'
;
$params
=
array_merge
(config(
'passport.proxy'
), [
'username'
=> request(
'email'
),
'password'
=> request(
'password'
),
]);
$respond
=
$client
->request(
'POST'
,
$url
, [
'form_params'
=>
$params
]);
}
catch
(RequestException
$exception
) {
throw
new
UnauthorizedException(
'请求失败,服务器错误'
);
}
if
(
$respond
->getStatusCode() !== 401) {
return
json_decode(
$respond
->getBody()->getContents(), true);
}
throw
new
UnauthorizedException(
'账号或密码错误'
);
}
}
|
config/passport.php 内容如下 。
1
2
3
4
5
6
7
8
9
|
<?php
return
[
'proxy'
=> [
'grant_type'
=> env(
'OAUTH_GRANT_TYPE'
),
'client_id'
=> env(
'OAUTH_CLIENT_ID'
),
'client_secret'
=> env(
'OAUTH_CLIENT_SECRET'
),
'scope'
=> env(
'OAUTH_SCOPE'
,
'*'
),
],
];
|
env 文件内容如下 。
1
2
3
4
|
OAUTH_GRANT_TYPE=password
OAUTH_CLIENT_ID=2
OAUTH_CLIENT_SECRET=2HaTQJF33Sx98HjcKDiSVWZjrhVYGgkHGP8XLG1O
OAUTH_SCOPE=*
|
我们需要用到的 client token 是 id 为 2 的 client token,不要搞错了哟~ 。
然后我们只需要在控制器中 use 这个 Trait,然后调用 $this->authenticate() 就可以得到认证成功的 token,如果请求失败的话,你可以使用 catch 来捕捉错误抛出异常.
1
2
3
4
5
6
7
8
9
10
11
|
public
function
login(Request
$request
)
{
$needs
=
$this
->validate(
$request
, rules(
'login'
));
$user
= User::where(
'email'
,
$needs
[
'email'
])->first();
if
(!
$user
) {
throw
new
UnauthorizedException(
'此用户不存在'
);
}
$tokens
=
$this
->authenticate();
return
succeed([
'token'
=>
$tokens
,
'user'
=>
new
UserResource(
$user
)]);
}
|
得到的 tokens 返回如以下格式 。
1
2
3
4
5
6
|
{
"token_type"
:
"Bearer"
,
"expires_in"
: 31536000,
"access_token"
:
"token_str"
,
"refresh_token"
:
"token_str"
}
|
做完这一切后你就可以在前端向这样子请求服务端了 。
1
2
|
axios.post(
'yourdomain/login'
,login_form).then(resource => {
})
|
如果请求成功,那么你将会得到 用户的信息和 access token,refresh token.
然后在你的前端 http 请求 header 里需要加入一个参数 Authorization 。
1
|
axios.defaults.headers.common[
'Authorization'
] = token.token_type +
' '
+ token.access_token
|
然后在你需要使用到 auth 认证的路由里使用中间件 auth:api,一切就大功告成啦~ 。
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:https://segmentfault.com/a/1190000012292902 。
最后此篇关于Laravel5.5中利用Passport实现Auth认证的方法的文章就讲到这里了,如果你想了解更多关于Laravel5.5中利用Passport实现Auth认证的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 Tornado 与 twitter 等第三方进行身份验证。 我的登录处理程序看起来像这样 class AuthLoginHandler(BaseHandler, tornado.auth.
有没有一种真正的方法可以在 Pylons 中添加身份验证?我见过很多不同的方法,但大多数方法要么过时,要么过于复杂。是否有教程可以解释如何以良好而可靠的方式添加身份验证? 最佳答案 考虑使用 repo
RESTful 身份验证是什么意思,它是如何工作的?我在谷歌上找不到很好的概述。我唯一的理解是您在 URL 中传递了 session key (记住),但这可能是非常错误的。 最佳答案 如何在 RES
我正在考虑在基于插件的系统中实现安全性的多种方式。现在,当我说“安全”时,我的意思是: a) 插件系统的开发人员如何确保插件在核心平台上的使用是安全的。b) 插件开发人员如何确保在其平台上使用的插件是
我正在使用 WCF Webhttp 服务。我创建了一堆服务,剩下的就是放入用户身份验证... 问题 与其余架构风格保持一致,我是否应该针对用户 db 验证每个服务调用。 如果是这样,我应该在每次调用服
假设我想对 Mifare Classic 进行身份验证。 我如何知道要发送到卡的确切类型的 APDU? 例子。 这段代码: bcla = 0xFF; bins = 0x86; bp1 = 0x0;
我通过在文件 xyz.php 中编写以下代码登录到网站。当我运行这个文件时,我会登录到 moodle 网站。有什么方法可以像下面的登录代码一样注销吗? $user = authenticate_use
我有一个应用程序可以匿名访问除几个之外的所有 xpages。我需要强制用户登录这些 xpages。是使用 beforepageload 事件来检查用户登录页面并将其重定向到正确的方式还是有更好的方法?
我想用 ember.js 实现身份验证。 因此,当应用程序启动时,在路由器处理请求的 url 之前,我想检查用户状态。如果用户未通过身份验证,我想保存请求的 url 并重定向到特定的 url (/lo
您如何执行 jQuery Ajax 调用并在发送请求之前对调用进行身份验证? 我还没有登录所以必须进行身份验证。安全不是任何人都可以访问的问题,只需要进行身份验证。它只是基本的 http 身份验证,您
我尝试使用找到的 swift 代码 here在网站上找到here ,但响应是带有两个错误的 html 代码:“您必须输入密码!”和“您必须输入用户名!”我是 NSURLSession 的新手,并尝试更
我正在尝试连接到 Visa Direct API,但我没有通过基本的 SSL 证书认证,这是我的代码: import requests headers = { 'Content
我正在用 tornado 在 python 中开发一个 REST API,我将实现身份验证和授权,试图避免锁定到其他大项目,即 django。我也在通过论坛和 SO 环顾四周,我喜欢一个可能适合的解决
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭10
如何在 Android 中通过 HTTP 进行身份验证? 最佳答案 我非常难以在 Android 中通过 HTTP 进行身份验证,因为在浏览器(Web 和 Android native )中它工作完美
我有一些关于登录和 session 的问题。我有这段代码: 数据库查询: login: function(req,callback) { var query = 'SELECT id FROM
我开始使用 Swift 开发 iOS 应用。现在我正处于需要创建登录系统的部分。但是,我们需要人们提供的 LinkedIn 信息。 我如何在 iOS 中使用 OAuth2 API 来实现这一点? 我已
如果没有找到用户,问题出在每个 $routeChangeStart 上,如果我只输入 url,它仍然会引导我访问页面。 现在我已经在服务器上重写了规则。 Options +FollowSymlinks
简单代码 require 'net/http' url = URI.parse('get json/other data here [link]') req = Net::HTTP::Get.new(
参考文档: https://docs.sonarqube.org/latest/instance-administration/security/ 概述 SonarQube具有
我是一名优秀的程序员,十分优秀!