我在Laravel 5中设置了Passport,并在用户使用此注册时创建了一个令牌。
$user->createToken('My Token')->accessToken;
当我创建一个新用户时,我可以在oauth_access_tokens表中看到一个如下所示的条目,我缩短了显示的ID ...
id | user_id | client_id | name | scopes | revoked
-----------------------------------------------------------
765765 | 193 | 1 | My Token | [] | 0
我想要允许访问的API路由受到保护,现在我试图通过在Postman中传递以下标题来允许访问...
Authorization | Bearer 765765
Accept | application/json
但这回复了未经认证的回复,我哪里错了?
答案 0 :(得分:4)
Laravel Passport使用oAuth2。它不像生成用户令牌并能够使用它进行身份验证那么简单。 oAuth2需要另一个步骤,称为令牌交换。
当您使用Facebook登录网站时,您将看到oAuth2进程正在运行。您单击使用Facebook登录按钮,然后您将被发送到Facebook,并且您将看到一个对话框,要求您确认或拒绝应用程序访问您的帐户(通常,您的帐户的特定部分,即{{1 }})。
该网站将拥有自己的Facebook客户帐户,并拥有自己的scopes
和client ID
。当您单击该按钮时,该网站会将您发送到Facebook以获得Facebook的许可和授权代码。该网站传递其client secret
,请求的权限(client ID
),随机生成的会话状态(以便稍后验证)和一个URL,以重定向到Facebook,在那里显示对话框。
当您接受时,Facebook会生成所谓的scopes
并在您前往网站的路上(指定的重定向网址)以及会话状态(因此网站能够验证请求)向您发送回信息和授权码。
该网站的后端将要求Facebook更换authorization code
的授权码,并提供access token
和client ID
,以便Facebook能够验证其真实性。 Facebook然后以client secret
和到期时间回复。
现在,该网站可以使用访问令牌访问您的帐户,以便能够获取所请求的信息(例如您的登录电子邮件地址)。
它也可以跳过很多这个过程而不需要用户必须遵循整个重定向流程。要做到这一点,(至少在Passport中),您将需要一个密码授予客户端。如果您使用oAuth2对API进行身份验证,通常会执行此操作。
此处的过程是生成密码授予客户端:
access token
在您的数据库中,您将在php artisan passport:client --password
表中找到具有客户端ID和密码的密码授予客户端。您需要将此信息提供给使用您的API的任何人(例如移动电话/手机应用)。
现在,当您的用户想要登录时,您的API的消费者(在这种情况下是Postman)需要提供用户的凭据(用户名/密码)以及密码的客户端ID和密码授予客户。还有必要告诉Passport您要通过密码授权进行授权。
文档中给出的示例如下所示:
oauth_clients
成功后,Passport将返回200响应并返回一些包含访问令牌和刷新令牌的JSON。您使用访问令牌访问用户的帐户,并使用刷新令牌获取新的访问令牌(无需用户再次登录)。
您需要在Authorization标头中提供此访问令牌作为承载。