如果不用于代币,Sanctum和Laravel的默认身份验证是否相同?

我不太清楚Laravel文档中的意思,所以我要求确定一下

我们有一个默认的身份验证,一个是Laravel,另一个是Sanctum

据说Sanctum既可以做代币,也可以简单地实现身份验证

对于此功能,Sanctum不使用任何类型的代币。相反,Sanctum使用Laravel内置的基于cookie的会话身份验证服务。这提供了CSRF保护、会话身份验证以及防止通过XSS泄漏身份验证凭据的好处。Sanctum只会在传入请求来自您自己的SPA前端(Vue.js)时尝试使用cookie进行身份验证

因此,如果不使用令牌,Sanctum基本上与默认身份验证方法相同,对吗?基本上,它是否实现默认身份验证并在需要时添加令牌?如果是这样的话,圣殿和护照有什么区别,因为他们做同样的事情,但圣殿据说是轻量级的。这到底是什么意思

谢谢你的阅读

因此,如果从未使用令牌,Sanctum基本上与默认身份验证方法相同,对吗

是的,在引擎盖下它使用了laravel的默认身份验证

看看圣殿守卫(下面的代码取自github。它最后一次提交是在4月11日,圣殿2.x)

<?php
名称空间Laravel\Sanctum;
使用Illumb\Contracts\Auth\Factory作为AuthFactory;
使用\Http\Request;
班长
{
/**
*身份验证工厂实现。
*
*@var\light\Contracts\Auth\Factory
*/
受保护的$auth;
/**
*应允许分钟数令牌保持有效。
*
*@var int
*/
受保护的美元到期;
/**
*创建一个新的guard实例。
*
*@param\light\Contracts\Auth\Factory$Auth
*@param int$expiration
*@返回无效
*/
公共函数构造(AuthFactory$auth,$expiration=null)
{
$this->auth=$auth;
$this->expiration=$expiration;
}
/**
*检索传入请求的经过身份验证的用户。
*
*@param\light\Http\Request$Request
*@返回混合
*/
公共函数调用(请求$Request)
{
if($user=$this->auth->guard(配置('sanctum.guard','web'))->user()){
返回$this->supportsTokens($user)
?$user->withAccessToken(新的TransientToken)
:$user;
}
如果($token=$request->bearerToken()){
$model=Sanctum::$personalAccessTokenModel;
$accessToken=$model::findToken($token);
如果(!$accessToken||
($this->到期&&&&&&&&&
$accessToken->创建于->lte(现在()->提交($this->到期))){
回来
}
返回$this->supportsTokens($accessToken->tokenable)?$accessToken->tokenable->withAccessToken(
轻触($accessToken->forceFill(['last\u used\u at'=>now()))->save()
):null;
}
}
/**
*确定可标记模型是否支持API标记。
*
*@param混合$tokenable
*@returnbool
*/
受保护函数supportsTokens($tokenable=null)
{
返回$tokenable&in_数组(HasApiTokens::class,class_使用_递归(
get_类($tokenable)
));
}
}

如果检查\u invoke()方法

if($user=$this->auth->guard(配置('sanctum.guard','web'))->user()){
返回$this->supportsTokens($user)
?$user->withAccessToken(新的TransientToken)
:$user;
}

使用以下命令找到经过身份验证的用户:

$user=$this->认证->守卫(配置('sanctum.guard','web'))->用户()

检查完sanctum配置文件后,当前没有sanctum.guardconfig(它可能用于将来的某个版本),因此sanctum默认使用webguard进行检查,因此它基本上与您的默认web路由执行相同的操作

但是你误解了圣所的用途。Sanctum用于API身份验证,而不用于web身份验证(尽管它也可以用于web身份验证)。Sanctum的非令牌身份验证是为了让您的SPA能够使用与移动应用程序相同的API(使用令牌身份验证),而不需要令牌,并提供csrf和基于会话的身份验证的好处

为了帮助您更好地理解,假设您构建了一个API,它使用令牌(如果它已经使用sanctum作为令牌,这会使事情更简单)进行身份验证。现在,您希望构建一个SPA(可以在laravel项目内部构建,也可以在同一域或不同域上构建一个单独的项目),该SPA将使用相同的API,但由于这将由您构建,它是一个受信任的站点,因此您不希望它使用令牌,而是使用laravel的默认基于会话的身份验证以及csrf保护,同时也使用相同的api路由。SPA将通过ajax与服务器通信。您还希望确保仅允许您的SPA使用基于会话的身份验证,而不允许其他第三方站点使用它

这就是圣所的作用。您只需将Sanctum中间件添加到app/Http/Kernel.php中的api路由组中即可

使用Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
“api”=>[
EnsureRefontendRequestsRestateful::类,
'节气门:60,1',
\Illumb\Routing\Middleware\SubstituteBindings::class,
],

然后配置sanctum以允许您的SPA域并配置cors(查看文档了解如何执行此操作)。然后只需将auth:sanctum中间件添加到路由中,服务器端设置就完成了

现在,如果请求有令牌或有状态(会话cookie),这些路由将对用户进行身份验证

现在,您的SPA可以在不使用令牌的情况下与API通信

要获得csrf保护,请先调用csrf cookie请求,这将在cookie中设置csrf令牌,axios将自动将其附加到后续请求

axios.get('/sanctum/csrf cookie')。然后(响应=&gt{
//登录。。。
})

sanctum和passport的区别是什么,因为它们做的是相同的事情,但据说sanctum是轻量级的

就像上面说的,圣殿很轻。这是因为Passport提供了完整的Oauth功能,而Sanctum只专注于创建和管理令牌。要以简单的方式解释Oauth,您必须在不同的站点上看到使用谷歌登录使用Facebook登录使用Github登录,然后您可以使用Google/Facebook/Github帐户将其登录到这些站点。这是可能的,因为Google、Facebook和Github提供了Oauth功能(只是一个简单的示例,不太详细)。对于大多数网站,您并不需要Passport,因为它提供了许多您不需要的功能。对于简单的api认证,Sanctum就足够了

发表评论