本文来自 pilishen.com----原文链接; 欢迎来和 pilishen 一起学习 php&Laravel ;学习群:109256050
OAuth2 是一个安全框架,控制着程序受保护部分的准入,主要是控制不同的客户端如何来调取 API,保证它们在请求相应资源的时候有相应的权限。
Laravel Passport 是一个强大的 Oauth2 服务实现,使用 Passport 往往已经足以应对我们日常 API 开发中的各种需求,甚至说,大部分时候,我们只是用到了 Passport 的部分功能而已。也正因为其强大,所以理解和使用起来也有一定难度,而这其中,理解和熟悉 oauth2 相关的各种授权类型是关键,授权类型理解了,Passport 也就没什么难的了。话不多说,一起来看看不同的授权类型都是怎么回事吧。
指的是调取你程序 API 的那个应用,或者说终端,在 Passport 里创建客户端可以通过 artisan 命令来进行
php artisan passport:client
每一个客户端( client )都要有一个 key, name, secret, redirect URI, user (程序创建者 /所有者)
这个指的是客户端请求的那个 API,其背后所对应资源(或者说数据)的所有者( user )
这个也就是我们的 API,可以是不需要读取权限的公共数据,也可以是需要验证权限的私有数据。公共数据,或者说公开节点( endpoints ),举个例子就是比如说搜索所有的 tweets 消息,或者说搜索微信文章,这不需要特别的权限,谁都可以搜。另一方面,假设说以某个用户的名义去发布( post )一个推特消息,发一个朋友圈,就需要来自这个用户的权限认证了。
指的是获取特定数据,或者进行特定操作的权限( permission ),可以在 AuthServiceProvider 使用Passport::tokensCan()
方法来具体定义权限( scope )
Passport::tokensCan([
'read-tweets' => 'Read all tweets',
'post-tweet' => 'Post new tweet',
]);
当客户端程序想要取得某些受保护的数据时,就要传递一个准入令牌( Access token ),以此来验证当前请求( request )。
授权( Grant ),说白了就是从资源服务器获取准入令牌( Access token )的方式,也可以更通俗地说成颁发令牌( token )的方式。一共有五种授权方式,其中四种是用来获取令牌( Access token )的,另一个是用来刷新、或者说重新创建一个已有令牌( token )的。
这是最常见的一种类型,说白了就是第三方登陆,也即当第三方的程序想着获取我们这边的受保护信息,这个第三方程序必须得获得我们这边用户的认证授权。更直白的,当第三方的客户端想着调用我们这边的用户信息,来登陆他们的网站,那么它得获得这个用户的认证授权。
大部分的流行 API 都会实现这一种授权类型。比如说 Facebook,当用户想着登陆我们的网站,我们可以先把用户重定向到 Facebook,让他先登陆 Facebook,然后 Facebook 会询问这个用户,是否同意我们的这个网站获取他在 Facebook 网站上的用户信息呢?用户点了授权以后,就又会被重定向回我们的网站,同时呢会附上一条认证码( Authorization Code ),然后呢我们的网站要利用这个认证码( Authorization Code ),再去向 Facebook 换取准入令牌( access token ),有了准入令牌以后,我们才可以进一步获取该用户的详细信息。
这整个过程,又通常被叫做“三条腿的 Oauth ”( 3-Legged OAuth ),当然了,还有“两条腿的 Oauth ”( 2-Legged OAuth ),也就是接下来的这一种。
Implicit,是模糊、含蓄、不具体指明的意思,这里呢译作模糊。模糊授权( Implicit Grant ),跟上面的认证码授权( Authorization Code )类似,不同的是,我们的资源服务器,返回的直接就是准入令牌( access token ),而不是认证码( authorization code )。因此呢,就不是需要三步才能获得 token。“三条腿的 Oauth ”被证明是更好的,可能你会纳闷,既然更好,还要这个“两条腿”的模糊授权( Implicit Grant )干啥?
认证码( authorization code )授权,需要的是一个服务器向另一个服务器( Facebook )发起请求,获取认证码,然后交换准入令牌。但如果我们面前是一个 JS 的 APP,它只是一个浏览器端,那么就很难获取了认证码再交换准入 token 了,这种情况下,我们就需要用到这种模糊授权( Implicit Grant )
Resource Owner == User
这种类型适合于我们信任的客户端,比如我们自己的手机 APP 来访问网站数据,这个时候,客户端直接使用用户的登陆密码信息请求资源服务器,服务器直接返回准入令牌( access token )。
这个适合于访问 API 的这个客户端,本身就是相应数据的所有者的时候,这期间不涉及到用户的互动,说白了就是纯粹的机器与机器之间的沟通。比如说一个 App 想着向用户显示一个对话框,或者储存一些跟这个 App 相关的数据到我们的资源服务器上。
当服务器生成一个令牌( token )的时候,同时也会设置一个 token 的有效期,或者说失效期。令牌刷新授权( Refresh token grant )就是当我们的 token 过期了,我们得需要将其刷新一下,重新生成一个。这种情况下,验证服务器会在生成准入 token 的同时发送一个 refresh token (刷新令牌),好后期用来生成一个新的 token。需要注意的是,这个流程并不适合于模糊授权( Implicit Grant )。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.