当前位置: 首页 > 后端技术 > PHP

LaravelPassport中的授权类型介绍

时间:2023-03-30 03:19:22 PHP

本文来自pilishen.com----原文链接;欢迎和毗利神一起学习php&Laravel;学习群:109256050控制不同的客户端如何调用API,保证在请求相应资源时有相应的权限。LaravelPassport是一个强大的Oauth2服务实现。往往使用Passport就足以满足我们日常API开发中的各种需求。甚至可以说,大多数时候,我们只是用到Passport的一些功能。也正是因为它的强大,所以难以理解和使用。其中,了解和熟悉与oauth2相关的各种授权类型是关键。如果理解了授权类型,Passport就不难了。话不多说,我们来看看不同的授权类型是怎么回事。概念理解:1.客户端(Client)是指调用你的程序API的应用程序,或者说终端。在Passport中创建客户端,可以使用artisan命令执行phpartisanpassport:client为每个client(客户端)必须有key,name,secret,redirectURI,user(程序创建者/拥有者)2.资源拥有者(ResourceOwner)指的是客户端请求的API,其背后对应的资源(或Data)拥有者(user)3.资源服务器(ResourceServer)这是我们的API,可以是不需要读取的公共数据权限,或需要验证权限的私人数据。公开数据,或者开放节点(端点),比如搜索所有推文,或者搜索微信文章。这不需要特殊权限,任何人都可以搜索。另一方面,假设你想以某个用户的名义发布(post)一条推特消息,发朋友圈,你需要得到这个用户的权限认证。4.范围是指获取特定数据或执行特定操作的权限。可以使用AuthServiceProvider中的Passport::tokensCan()方法来具体定义权限(范围)Passport::tokensCan(['read-tweets'=>'Readalltweets','post-tweet'=>'Postnew鸣叫',]);5.访问令牌(Accesstoken)当客户端程序想要获取一些受保护的数据时,需要传递一个访问令牌(Accesstoken)来验证当前的请求(request)。授权类型(GrantType)授权(Grant),说白了就是从资源服务器获取访问令牌(Accesstoken)的方式,也可以更笼统的说是发行令牌(token)的方式).有五种授权方法,其中四种用于获取访问令牌,另一种用于刷新或重新创建现有令牌。1.授权码授予(AuthorizationCodegrant)这是最常见的类型。说白了就是第三方登录,也就是第三方程序要获取我们受保护的信息的时候,这个第三方程序必须要经过授权。获得我们用户的认证和授权。说白了就是当第三方客户端要调用我们的用户信息登录他们的网站时,必须要获得用户的认证授权。大多数流行的API都实现了这种授权类型。比如Facebook,当用户要登录我们的网站时,我们可以先将用户重定向到Facebook,让他先登录Facebook,然后Facebook会询问用户是否同意我们的网站来获取他的用户Facebook网站上的信息呢?用户点击授权后,会被重定向回我们的网站,同时会附上一个认证码(AuthorizationCode),然后我们的网站会使用这个认证码(AuthorizationCode),然后去到Facebook以换取授权。访问令牌(accesstoken),有了访问令牌,我们可以进一步获取用户的详细信息。这整个过程通常被称为“三足Oauth”(3-LeggedOAuth),当然也有“两足Oauth”(2-LeggedOAuth),就是下一个。2.隐式授予(ImplicitGrant)隐式是指模糊的、隐含的、未指定的。这里译为模糊。模糊授权(ImplicitGrant)和上面的授权码授权(AuthorizationCode)类似,不同的是我们的资源服务器直接返回访问令牌(accesstoken),而不是认证码(authorizationcode)。因此,无需三步即可获取token。“三足Oauth”被证明是更好的,你可能想知道,既然它更好,为什么还需要这种“两足”的模糊授权(ImplicitGrant)?授权码(authorizationcode)授权需要一台服务器向另一台服务器(Facebook)发起请求,获取授权码,然后交换访问令牌。但是如果我们面对的是一个JSAPP,它只是一个浏览器,那么获取认证码再交换accesstoken就比较困难了。这种情况下,我们就需要使用这种模糊授权(ImplicitGrant)3.用户密码授权(ResourceOwnerPasswordCredentialsGrant)ResourceOwner==User这种类型适合我们信任的客户端,比如我们自己的手机APP来访问网站数据。此时客户端直接使用用户的登录密码信息请求资源服务器,服务器直接返回一个accesstoken。4.ClientCredentialsGrant,适用于访问API客户端,是对应数据的拥有者。在此期间,不涉及用户交互。说白了就是纯粹的机器之间。沟通。例如,一个App想要向用户显示一个对话框,或者在我们的资源服务器上存储一些与App相关的数据。5.刷新令牌授予当服务器生成一个令牌(token)时,它也设置了一个令牌有效期,或者过期日期。刷新令牌授予意味着当我们的令牌过期时,我们需要刷新它并生成一个新的。在这种情况下,验证服务器会在生成访问令牌的同时发送一个刷新令牌(refreshtoken),可以用来稍后生成新的令牌。需要注意的是,这个过程不适合模糊授权(ImplicitGrant)。