Laravel Passport 使用 Password Grant Type
打赏作者

Laravel Passport 使用 Password Grant Type

Laravel 5.3 新特性 >> Laravel Passport 使用 Password Grant Type 视频发布于 2016-09-07

在 OAuth 2.0 的认证体系中,其实有几种不一样的请求认证方式,其中 Password Grant Type 也是一种非常常见的认证,它不仅在避免了整个认证的重定向流程,也提供了认证方式,可以作为一种常用的方式来考虑
NEIXZ

怎么把默认的email+password 字段改成username+password呢?

manpai 回复 NEIXZ
public function username()
    {
        return 'email';
    }

改成

public function username()
    {
        return 'username';
    }
TonyWang 回复 manpai

你好。是加在什么地方呢

JellyBool 回复 TonyWang

Http/Auth/AuthController 或者 LoginController,这个看你的 laravel 版本

TonyWang 回复 JellyBool

我其实没有使用 make:auth 来生成注册登录,是自己另外写的。
客户端发过来要认证的账号和密码,最终服务端是怎么来验证账号密码的呢?

JellyBool 回复 TonyWang

你看看 passport 中的 AuthorizedAccessTokenController 这个文件的代码,应该就清楚了

TonyWang 回复 JellyBool

没有看明白

JellyBool 回复 TonyWang

额。。那你还是 Auth::attemp() 之后在判断是否存在跟该 用户相关联的 secret 吧

TonyWang 回复 JellyBool

教主,这一句没懂

JellyBool 回复 TonyWang

额,你看看 passport 生成的那几张表。其实就是一个关联关系而已。首先判断用户的用户名和密码是否正确,再检测是否有关联的 client 或者 secret 就行

TonyWang 回复 JellyBool

我找了 passport 相关的源码,还是没怎么看懂。我后面再看看,谢谢教主的耐心解答。

TonyWang 回复 JellyBool

已找到具体解决方法。
在 user 模型里添加:
public function findForPassport($username)
{
return self::where(‘username’, $username)->first();
}

ifwelove

請問一下, 目前有實現admin (後台) call api 透過 passport 的 Password Grant Type 去取得access_token做認證之後做任何呼叫api都需要該組access_token,

但是目前遇到一個問題是, 如果 web (前台) 也想要使用access_token去做認證, 但是在user 沒有登入的情況下, 該如何取得access_token?

也就是說某些API, 是可以不用認證的, 但是至少要拿access_token來取得資料

目前是有一個想法, 只是覺得不怎麼好.

就是在user沒有登入的情況下, 先在資料表建立一筆user, 專門給沒有登入會員的user去使用該組資料, 並且接續去做後面執行呼叫api的動作

Admin 回复 ifwelove

oauth的中间件有clientuser两种。
中间件分别是oauth-clientoauth-user,层主可以按需使用相应的中间件。

ifwelove 回复 Admin

以解決, 謝謝

xrpeng

多个实体用passport验证如何配置?如user和admin,前后端都用passport。

JellyBool 回复 xrpeng

看了一下源码,目前来说,貌似 passport 还不支持这种多表认证。

xrpeng 回复 JellyBool

那有没有变通的办法?

JellyBool 回复 xrpeng

做一个表,或者你改 passport 的源码

xrpeng 回复 JellyBool

好的,谢谢。

GOD_Nt

看了3边,又实战了个项目,有看了好多文章终于知道怎么用passport了。。。

charlie

目前通过Passport Password Grant Type来登陆系统拿到access token。但是在登陆的时候希望使用验证码,那么后台如何验证前端发回来的captcha的值呢。

App\Http\Controllers\AuthLoginController中覆写public function login(Request $request) 并不起作用啊。

Laravel 5.4
Passport 3.0

恳请大神指点~~

JellyBool 回复 charlie

不起作用具体是什么?理论上来说是重写 login 是没什么问题的

charlie 回复 JellyBool
    public function login(Request $request)
    {
        /**
         * 验证验证码
         */
        Log::info("Hello");

        if(session('captcha')!==$request->get('captcha_word'))
        {
            return $this->sendFailedLoginResponse($request);
        }

我在方法的最前面打了log,但是log并没有任何输出。依此判定…我也感觉很奇怪
使用了passport dingo api. 看起来登陆过程不从这个controller过一样。

是不是web的登陆才使用该LoginController?

JellyBool 回复 charlie

对,在 web 下,默认才是走这个路由。。。

你是纯粹的 api 话,验证码这种形式也是走不通的,因为 api 是不依赖 session 的

charlie 回复 JellyBool

那纯api的话,该如何实现验证码呢?
我该覆写哪个controller呢,怎么实现?看到:

|        | POST     | oauth/token                             |      | \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken        | throttle   |

没有session其实也有解决的办法,可以在发给前端验证码图的同时给他一个加密字符串,前端输入验证码的时候,要把这个字符串传回去,后台check。

主要这是其他人提出的需求,希望能在登陆的时候增加破解的难度,api搞验证码的确比较怪异,不知道jelly有没有什么更好的思路。
感谢!

JellyBool 回复 charlie

这种 api 方式下,我并没有什么有的方案处理这种 session 的验证码。貌似我也没遇到过这种需求;

理论意义上来说,使用 api 登录,你只需要提供 accessToken 就可以了。

尼好再见

我现在做了用户账号密码的方式进行认证,然后又写了注册的API 那么 我想说用户调用我注册的API后我能不能获取到Accesstoken 给客户端?我现在想到的是 用刚注册的用户名和密码去请求 oauth 的接口 我想说 除了这个办法外还有没有其他简单的方法

JellyBool 回复 尼好再见

好像我也不知道有没有更简单的方式了,感觉换取token总要有这个流程

foxriver123

这种有点认证很诡异,如果我是用户的话,我会想你这样什么网站啊是不是想盗取我的账户信息,个人觉得还是前面Oauth2.0来的实在? so what u guys think?

JellyBool 回复 foxriver123

这有啥,只不过是不同的认证方式而已

longjl1980

老师,能给讲讲隐式授权令牌吗?

JellyBool 回复 longjl1980

https://laravel.com/docs/5.6/passport#implicit-grant-tokens

这个文档是否OK?就是少了交换 code 的步骤吧

longjl1980 回复 JellyBool

谢谢,我马上去看看