我正在try 创建一个API,并在我自己的应用程序(web应用程序和本机移动应用程序)中使用它,并将其用于第三方应用程序(这是为了将来的目的).

我已经阅读了Laravel Passport份文档,我有些怀疑,希望有人能帮助我.

作为一名开发人员,我总是试图找到最好、正确的方法来实现我的项目,并为项目的目的找到合适的包.


Brief explanation of what I want to do:

我想创建一个API,我将在我的网络和移动应用程序中使用我自己的API,我的API有两个端点用于注册和登录studentsteachers.他们可以使用邮箱和密码登录.每个用户类型都有自己的信息.教师可以有CV,学生可以看到教师的简历(整个创建和阅读CV's都在我的API中处理),这两种用户类型可以相互通信.我正在使用laravel 6.x版本来构建我的API.在我们的子域中,我们有一个面向开发者的部分,developers可以注册帐户,获得/购买access token,向我的API发出请求并使用它,另一方面,我希望当学生或教师登录到他们的帐户时,API会为该用户生成一个access token,这样我的应用程序就可以使用该令牌,并在每次请求中传递该令牌,以使用户通过身份验证来访问其私有资源,如我们所知的仪表板,API's是无状态的,我们不能使用会话来存储用户凭据,所以我们需要一个访问令牌.

Can Laravel Passport generate the both Developer access token, and User( teacher or student) access token?
Is it correct to use OAuth in here to develop my API? Or can I just use tymondesigns/JWT package for these purposes?


我得说我对OauthAPI based applications都是新手.我读过一些关于Oauth的文章,我对Oauth terminology有点熟悉,但仍然不知道如何正确地实施这个项目.

以下是我的问题:

  1. Oauth server到底是多少?API托管的是我自己的服务器吗?

  1. Laravel Passport次配置和数据库迁移之后,Laravel Passport次在我的数据库中创建了一些表,如果您能告诉我每个表的用途,我将不胜感激?表名是failed_jobsoauth_access_tokensoauth_auth_codesoauth_clientsoauth_personal_access_clientsoauth_refresh_tokens.

  1. 我已将我的Laravel应用程序配置为使用Laravel Passport,并在api.php文件中创建了两个Routes
Route::post('login','API\Auth\UserAuthController@login');
Route::post('register','API\Auth\UserAuthController@register');

然后,我创建了UserAuthController.php文件,并编写了登录和注册方法.他们正在毫无问题地工作.用户注册或登录他们的帐户后,我的代码将生成personal access token.

$token = $user->createToken('authentication')->accessToken;

and then students or teachers can access to the private resources of their own with this access token. Is it right to create a personal access token for my two types of users? What is exactly a personal access token?
I just know you can pass it into request header, and the server will authorize you to access private resources. what I mean by private resources is the endpoints which are protected by API middleware like this:

Route::post('/update-info','API\Auth\UserAuthController@update')->middleware('auth:api');

  1. 当老师和学生登录他们的帐户时,我创建personal access token是正确的,还是我应该用另一种方式来处理它?!这种方法有效,但如果还有其他方法,我会寻找正确的方法.

  1. 奇怪的是,每次用户登录时,Laravel Passport都会创建一个令牌,但它不会判断用户是否已经创建了令牌?如果有人可以访问API个端点,他们可以向/login端点发出post请求,并创建大量令牌.有问题吗?如何修复它?

  1. 当我创建personal access token时,我需要将一个参数传递给createToken($arg)方法,它存储在oauth_personal_access_clients表中.这样做的目的是什么?它只是为了Laravel Passport目的,还是我将来需要它?

  1. 我有一些端点不受auth:api middleware保护,例如,每个用户访问我的应用程序,他们可以搜索教师姓名和课程,以及,没有必要让他们先登录或注册.我的应用程序中的每个人都可以访问这些端点,并且可以自由搜索和提前搜索某些信息.我的问题是,如果我让每个人都可以访问它,我如何才能访问only My first-party appthird-party app可以访问的这些端点.我的意思是,我不希望人们在没有访问令牌的情况下通过command linepostman或某种工具来访问它们,我希望保护这些端点免受攻击者的攻击,而不是发出大量请求来关闭我的服务器.我如何保护这种端点?我知道我可以每分钟limit requests次,但我不知道限制它?还有别的办法吗?

  1. Oauth terminology中有一个术语叫做clients,据我所知,clientsweb applicationsnative mobile app之类的应用程序,任何使用我的API的应用程序都叫做clients.我说得对吗?我认为这是针对第三方应用authentication的.在阅读了关于clientsLaravel Passport文档之后,我有点困惑,当我配置Laravel Passport时,它会生成two clients并将它们存储在数据库中.我需要为我的应用程序创建客户端吗?!如何忽略第一方应用程序的授权流just

  1. 经过Laravel Passport次配置后,现在我可以看到它为客户端生成了一些默认路由.
/oauth/clients
/oauth/clients/{client-id}
/oauth/authorize
/oauth/token

routes个有什么用?!我需要他们来创建我的first-party applications吗?


  1. 正如我所说,这个应用程序的future 目的是让third-party applications人可以访问API,我必须创建一个网页,developers注册一个帐户,并获得/购买token来访问我的API.有没有可能用Laravel Passport来做,或者我应该写我自己的逻辑来让它工作?我需要为我的第三方客户创建客户吗?

非常感谢您的帮助<3.

推荐答案

我要花很长时间才能深入回答你们的每一个问题,所以我

基本上,我建议你在第一方客户(你的移动应用和网络应用)中使用password credentials grant flow.其中一位客户

您仍然需要定义自己的"注册"路由,但可以使用oauth/token路由

  1. Oauth server到底是多少?API托管的是我自己的服务器吗?

OAuth服务器将是运行Passport的服务器.或者在官方

在您的情况下,"资源服务器",即为您的内容提供服务的API,将是

  1. Laravel Passport次配置和数据库迁移之后,Laravel Passport次在我的数据库中创建了一些表,如果您能告诉我每个表的用途,我将不胜感激?表名是failed_jobsoauth_access_tokensoauth_auth_codesoauth_clientsoauth_personal_access_clientsoauth_refresh_tokens.

failed_jobs表与Passport没有直接关系.这与拉威尔的排队有关.见Dealing With Failed Jobs.

其余的表都在那里,这样Passport就可以跟踪它创建的客户机和代码.

  • oauth_clients:看RFC clients section.
  • oauth_access_tokens:看RFC access tokens section.
  • oauth_auth_codes:见Authorization Code Grant.
  • oauth_personal_access_clients:个人访问客户端似乎不是官方规范的一部分,但它基本上是一个客户端,用于用户希望直接获得访问令牌,而不是通过应用程序或网站.通常情况下,开发人员希望获得访问令牌,以便能够以自己的帐户调用API端点.
  • oauth_refresh_tokens:看RFC refresh tokens section.
  1. 为我的两类用户创建个人访问令牌是否正确?什么是个人访问令牌?

每个用户都需要获得自己的访问令牌,但不是个人访问令牌.

个人访问令牌就是专门为想要生成

因此,在您的情况下,服务器将为用户创建"正常"访问令牌,而不是"个人"访问令牌

  1. 当老师和学生登录他们的帐户时,我创建personal access token是正确的,还是我应该用另一种方式来处理它?!这种方法有效,但如果还有其他方法,我会寻找正确的方法.

见对问题3的答复.

  1. 奇怪的是,每次用户登录时,Laravel Passport都会创建一个令牌,但它不会判断用户是否已经创建了令牌?如果有人可以访问API个端点,他们可以向/login端点发出post请求,并创建大量令牌.有问题吗?如何修复它?

我不认为这是个问题.这条oauth/token英里的路由是限价的.你可以更严格地限制它.

您还可以收听events并删除或撤销令牌

  1. 当我创建personal access token时,我需要将一个参数传递给createToken($arg)方法,它存储在oauth_personal_access_clients表中.这样做的目的是什么?它只是为了Laravel Passport目的,还是我将来需要它?

这张桌子是给拉威尔Passport 的.它也可以用于以后要审计或调试某些内容的时候.

oauth_personal_access_clients表中看到的行是在运行php artisan passport:install时创建的.

调用createToken时,会在oauth_access_tokens中插入一个新行.

  1. 我有一些端点不受auth:api middleware保护,例如,每个用户访问我的应用程序,他们可以搜索教师姓名和课程,以及,没有必要让他们先登录或注册.我的应用程序中的每个人都可以访问这些端点,并且可以自由搜索和提前搜索某些信息.我的问题是,如果我让每个人都可以访问它,我如何才能访问only My first-party appthird-party app可以访问的这些端点.我的意思是,我不希望人们在没有访问令牌的情况下通过command linepostman或某种工具来访问它们,我希望保护这些端点免受攻击者的攻击,而不是发出大量请求来关闭我的服务器.我如何保护这种端点?我知道我可以每分钟limit requests次,但我不知道限制它?还有别的办法吗?

是的,你必须做利率限制.你必须进行实验,看看什么对你有用.

  1. Oauth terminology中有一个术语叫做clients,据我所知,clientsweb applicationsnative mobile app之类的应用程序,任何使用我的API的应用程序都叫做clients.我说得对吗?我认为这是针对第三方应用authentication的.在阅读了关于clientsLaravel Passport文档之后,我有点困惑,当我配置Laravel Passport时,它会生成two clients并将它们存储在数据库中.我需要为我的应用程序创建客户端吗?!如何忽略第一方应用程序的授权流just

是的,客户端就像web应用程序、移动应用程序等.通常你会有一个新的

你可以用Laravel Password Grant Client来做

通过使用

关于密码凭证流的RFC部分在here中提供.

您可以阅读更多关于RFC如何定义客户端here的信息.

  1. routes个有什么用?我需要他们来创建我的first-party applications吗?

第一方申请所需:

  • /oauth/token

第一方申请不需要:

  • /oauth/clients:第三方开发人员可以查看他们创建了哪些客户端.
  • /oauth/clients/{client-id}:让第三方开发者更新他们的一个客户.
  • /oauth/authorize:第三方开发者将调用此路径来启动

Managing clients页的"JSON API"一节中,您可以阅读有关上述路由的更多信息.

  1. 正如我所说,这个应用程序的future 目的是让third-party applications人可以访问API,我必须创建一个网页,developers注册一个帐户,并获得/购买token来访问我的API.有没有可能用Laravel Passport来做,或者我应该写我自己的逻辑来让它工作?我需要为我的第三方客户创建客户吗?

您可以使用Laravel Passport provides Vue组件,以便开发人员能够创建客户端.您可以使用这些组件,也可以创建自己的前端并调用

请记住,OAuth最初是为第三方应用程序需要访问things on behalf of a user而设计的.因此,第三方应用程序将获得客户ID和客户机密,而不是获得访问令牌,它们需要 for each 想要代表其行事的用户从authorization grant flows个应用程序中 Select 一个.

如果你永远不会有第三方应用程序需要代表用户,那么可能值得考虑 comments 中提到的其他协议.

Laravel相关问答推荐

我如何通过 laravel 在高图中针对不同的时间范围进行烛台数据分组

Laravel 9 如何将 url 中的参数从一个控制器传递到另一个控制器?

在 laravel 中查询此类数据的最佳做法是什么?

如何使用 Laravel Passport 在 API 中正确实现 OAuth?

Laravel 5.4 中的自定义助手类

允许的内存大小 134217728 字节用尽(试图分配 20480 字节) Laravel

磁盘 [视频] 没有配置的驱动程序

刚安装 Lumen 并得到 NotFoundHttpException

如何在 Laravel 5.5 中扩展 vendor 包服务提供者

如何在 Laravel 5.5 的 FormRequest 类中返回自定义响应?

使用数据库用户提供程序时如何在 Laravel 中创建密码重置方法

调用未定义的方法 Maatwebsite\Excel\Excel::load()

如何从不是控制器方法的方法发送响应?

laravel 5.4 指定的key太长,为什么数字191

如何将Carbon 转换为字符串,只取日期?

在 Laravel 中,如何获取 *only* POST 参数?

Select,where JSON 包含数组

找不到框laravel/homestead

Laravel 中的 isDirty() 是什么意思?

如何在laravel中 for each 用户生成唯一的随机值并将其添加到数据库中