Par*_*mhn 15 php api oauth laravel laravel-passport
我正在尝试创建一个API并在我自己的应用程序(Web 应用程序和本机移动应用程序)中使用它,并使其可用于第三方应用程序(这是为了将来的目的)。
我已经阅读了Laravel Passport文档,我有一些疑问,希望有人可以帮助我。
作为一名开发人员,我总是试图找到实现我的项目的最佳和正确的方法,并为项目的目的找到合适的包。
简要说明我想做什么:
我想创建一个API,我将在我的 Web 和移动应用程序中使用我自己的API,我的API有两个端点,用于学生和教师的注册和登录。他们可以使用他们的电子邮件和密码登录。每个用户类型都有自己的信息。老师可以有简历,学生可以看到老师的简历(整个创建和阅读简历都在我的API中处理),并且他们两种用户类型可以相互交流。我正在使用laravel 6.x版本来构建我的API。我们在我们的子域中有一个开发人员部分,其中开发人员可以注册帐户并获取/购买访问令牌向我的 API 发出请求并使用它,另一方面,我希望当学生或教师登录到他们的帐户时,API 会为该用户生成一个访问令牌,这样我的应用程序就可以使用该令牌并在每个请求中传递它使用户通过身份验证以访问他们的私人资源,例如他们的仪表板,因为我们知道API是无状态的,我们不能使用会话来存储用户凭据,因此我们需要一个访问令牌。
灿Laravel护照产生两个开发人员访问令牌,以及用户(教师或学生)访问令牌?在这里
使用OAuth来开发我的API是否正确?或者我可以将tymondesigns/JWT包用于这些目的吗?
我不得不说我是Oauth和基于 API 的应用程序的新手。我读过一些关于Oauth 的文章,我对Oauth terminology有点熟悉,但是,我仍然不知道如何正确实施这个项目。
所以这里是我的问题:
- 什么是Oauth 服务器?它是由API托管的我自己的服务器吗?
- 在Laravel Passport配置和数据库迁移之后,Laravel Passport在我的数据库中创建了一些表,如果您能告诉我每个表的用途是什么,我将不胜感激?表名是failed_jobs、oauth_access_tokens、oauth_auth_codes、oauth_clients、 oauth_personal_access_clients、oauth_refresh_tokens。
- 我已将Laravel应用程序配置为使用Laravel Passport,并在api.php文件中创建了两个路由
Route::post('login','API\Auth\UserAuthController@login');
Route::post('register','API\Auth\UserAuthController@register');
Run Code Online (Sandbox Code Playgroud)
然后,我创建了UserAuthController.php文件并编写了登录和注册方法。他们工作没有任何问题。用户注册或登录他们的帐户后,我的代码将生成个人访问令牌。
$token = $user->createToken('authentication')->accessToken;
Run Code Online (Sandbox Code Playgroud)
然后学生或教师可以使用此访问令牌访问自己的私人资源。为我的两种类型的用户创建个人访问令牌是否正确?什么是个人访问令牌?
我只知道你可以把它传递到请求头中,服务器会授权你访问私有资源。我所说的私有资源是指受API 中间件保护的端点,如下所示:
Route::post('/update-info','API\Auth\UserAuthController@update')->middleware('auth:api');
Run Code Online (Sandbox Code Playgroud)
- 当教师和学生登录他们的帐户时,我是否正确创建个人访问令牌,或者我应该采取其他方式来处理它?!这种方式有效,但如果还有其他事情,我正在寻找正确的方式。
- 这里奇怪的是Laravel Passport每次用户登录时都会创建一个令牌,它不检查他们是否已经创建了令牌?如果有人可以访问
API端点,他们可以向 /login 端点发出 post 请求并创建大量令牌。这是个问题吗?如何解决?
- 当我创建个人访问令牌时,我需要向
createToken($arg)方法传递一个参数,它存储在oauth_personal_access_clients表中。这样做的目的是什么?它只是为了Laravel Passport 的目的,还是我将来需要它?
- 我有一些不受
auth:api中间件保护的端点,例如,每个用户访问我的应用程序,他们都可以搜索教师姓名和课程......,没有必要让他们先登录或注册。我的应用程序中的每个人都可以访问这些端点,并且他们可以自由搜索和提前搜索一些信息。我的问题是,如果我让每个人都可以访问它,我如何保护这些只有我的第一方应用程序和第三方应用程序可以访问它们的端点。我的意思是我不希望人们通过命令行或邮递员或者一些没有访问令牌的工具,我想保护这些端点免受攻击者的攻击,不要发出大量请求来关闭我的服务器。如何保护此类端点?我知道我可以限制的请求,每分钟,但我不知道有多少的限制呢?有没有其他办法?
- 我看到Oauth 术语中有一个称为客户端的术语,因为我理解客户端是Web 应用程序或本机移动应用程序之类的应用程序,而使用我的 API 的任何其他应用程序都称为客户端。我对吗?我认为这是用于第三方应用程序身份验证。阅读Laravel Passport关于clients 的文档后,我有点困惑,当我配置Laravel Passport 时,它生成两个客户端并将它们存储在数据库中。我需要为我的应用程序创建一个客户端吗?!如何忽略授权流程仅用于第一方应用程序?
- 在Laravel Passport配置之后,现在我可以看到它为客户端生成了一些默认路由。
/oauth/clients
/oauth/clients/{client-id}
/oauth/authorize
/oauth/token
Run Code Online (Sandbox Code Playgroud)
这些路由的用途是什么?!我需要它们来创建我的第一方应用程序吗?
- 正如我所说,这个应用程序的未来目的是让第三方应用程序可以访问 API ,我必须创建一个网页,开发人员注册一个帐户并获取/购买令牌以访问我的 API。是否可以使用Laravel Passport来实现,或者我应该编写自己的逻辑来使其工作?我需要为我的第三方客户创建一个客户吗?
非常感谢您的帮助 <3
Del*_*lan 20
我要花很长时间才能深入回答您的每个问题,因此我尝试链接到 RFC 中的相关部分以供进一步阅读。
从本质上讲,我建议您为第一方客户端(您的移动应用程序和 Web 应用程序)使用密码凭据授予流程。Laravel 将为您创建的客户端之一是“Laravel 密码授予客户端”,其文档可在此处获得。
您仍然需要定义自己的“注册”路线,但您可以使用该oauth/token路线而不是您自己的/login路线。
- 什么是Oauth 服务器?它是由API托管的我自己的服务器吗?
OAuth 服务器将是您运行 Passport 的服务器。或者根据RFC的官方术语,OAuth 服务器/Passport 服务器将被称为“授权服务器”。
在您的情况下,您的 API 为您的内容提供服务的“资源服务器”将是与“授权服务器”相同的服务器。
- 在Laravel Passport配置和数据库迁移之后,Laravel Passport在我的数据库中创建了一些表,如果您能告诉我每个表的用途是什么,我将不胜感激?表名是failed_jobs、oauth_access_tokens、oauth_auth_codes、oauth_clients、 oauth_personal_access_clients、oauth_refresh_tokens。
该failed_jobs表与 Passport 没有直接关系。这与 Laravel 的队列有关。请参阅处理失败的作业。
其余的表都在那里,以便 Passport 可以跟踪它创建的客户端和代码。
oauth_clients:请参阅RFC 客户端部分。oauth_access_tokens:请参阅RFC 访问令牌部分。oauth_auth_codes:请参阅授权代码授予。oauth_personal_access_clients:个人访问客户端似乎不是官方规范的一部分,但它基本上是用户想要直接获取访问令牌的客户端,而不是通过应用程序或网站。这通常是希望获得访问令牌以便能够在自己的帐户上调用 API 端点的开发人员。个人访问客户端表存储专门为此目的创建的客户端。通常只有其中之一。oauth_refresh_tokens:请参阅RFC 刷新令牌部分。
- 为我的两种类型的用户创建个人访问令牌是否正确?什么是个人访问令牌?
每个用户都需要获得自己的访问令牌,而不是个人访问令牌。
个人访问令牌只是专门为想要自己生成和使用访问令牌的用户创建的访问令牌。在 Laravel Passport 中,具体来说,它们是链接到“Laravel Personal Access Client”的访问令牌。
因此,在您的情况下,您的服务器将为用户创建“普通”访问令牌,而不是“个人”访问令牌。
- 当教师和学生登录他们的帐户时,我是否正确创建个人访问令牌,或者我应该采取其他方式来处理它?!这种方式有效,但如果还有其他事情,我正在寻找正确的方式。
见问题 3 的答案。
- 这里奇怪的是Laravel Passport每次用户登录时都会创建一个令牌,它不检查他们是否已经创建了令牌?如果有人可以访问
API端点,他们可以向 /login 端点发出 post 请求并创建大量令牌。这是个问题吗?如何解决?
我不认为这是一个问题。该oauth/token路线是限速的。您可以对其进行更多速率限制。
如果想限制单个用户可能拥有的令牌数量,您还可以侦听事件并删除或撤销令牌。
- 当我创建个人访问令牌时,我需要向
createToken($arg)方法传递一个参数,它存储在oauth_personal_access_clients表中。这样做的目的是什么?它只是为了Laravel Passport 的目的,还是我将来需要它?
此表仅适用于 Laravel Passport。它也可用于以后要审核或调试某些内容的情况。
您在oauth_personal_access_clients表中看到的行是在您运行php artisan passport:install.
当您调用时createToken,一个新行被插入到oauth_access_tokens.
- 我有一些不受
auth:api中间件保护的端点,例如,每个用户访问我的应用程序,他们都可以搜索教师姓名和课程......,没有必要让他们先登录或注册。我的应用程序中的每个人都可以访问这些端点,并且他们可以自由搜索和提前搜索一些信息。我的问题是,如果我让每个人都可以访问它,我如何保护这些只有我的第一方应用程序和第三方应用程序可以访问它们的端点。我的意思是我不希望人们通过命令行或邮递员访问它们或者一些没有访问令牌的工具,我想保护这些端点免受攻击者的攻击,不要发出大量请求来关闭我的服务器。如何保护此类端点?我知道我可以限制的请求,每分钟,但我不知道有多少的限制呢?有没有其他办法?
是的,您必须进行速率限制。你必须进行试验,看看什么对你有用。
- 我看到Oauth 术语中有一个称为客户端的术语,因为我理解客户端是Web 应用程序或本机移动应用程序之类的应用程序,而使用我的 API 的任何其他应用程序都称为客户端。我对吗?我认为这是用于第三方应用程序身份验证。阅读Laravel Passport关于clients 的文档后,我有点困惑,当我配置Laravel Passport 时,它会生成两个客户端并将它们存储在数据库中。我需要为我的应用程序创建一个客户端吗?!如何忽略授权流程仅用于第一方应用程序?
是的,客户端就像 Web 应用程序、移动应用程序等。通常你会为每个移动应用程序、Web 应用程序、CLI 等都有一个新客户端,但除了这些应用程序,Laravel 定义了“密码授予客户端”和“Personal Access Client”为您提供具有特定用途的客户端。
您可以将Laravel 密码授予客户端用于您的两个应用程序,因为它们是第一方应用程序。
您可以使用/oauth/token为密码授予客户端提供的路由来忽略第一方应用程序的授权流
。
您可以在此处阅读有关 RFC 如何定义客户端的更多信息。
- 这些路由的用途是什么?我需要它们来创建我的第一方应用程序吗?
第一方应用程序需要:- /oauth/token
第一方应用程序不需要:
/oauth/clients:这是供第三方开发人员查看他们创建了哪些客户端。 /oauth/clients/{client-id}:供第三方开发人员更新其客户之一。/oauth/authorize:此路由将由第三方开发人员调用,以使用他们的客户端 ID 和密钥启动
授权授予流程。您可以在管理客户端中的“JSON API”部分下阅读有关上述路由的更多信息。
- 正如我所说,这个应用程序的未来目的是让第三方应用程序可以访问 API ,我必须创建一个网页,开发人员注册一个帐户并获取/购买令牌以访问我的 API。是否可以使用Laravel Passport来实现,或者我应该编写自己的逻辑来使其工作?我需要为我的第三方客户创建一个客户吗?
Laravel Passport提供了您可以使用的 Vue 组件,以便开发人员能够创建客户端。您可以使用这些组件,也可以创建自己的前端并从自己的前端调用JSON API 路由。
请记住,OAuth 最初是为第三方应用程序需要代表用户访问事物而设计的。因此,第三方应用程序将获得客户端 ID 和客户端密钥,而不是获取访问令牌,并且他们需要为他们想要代表的每个用户通过一个授权授予流程。
如果您永远不会拥有需要代表用户行事的第三方应用程序,那么可能值得考虑评论中提到的其他协议。