使用Laravel passport oauth / token发送更多数据

时间:2017-04-03 01:37:28

标签: php laravel oauth laravel-passport

所以,我正在使用Laravel + Passport,到目前为止工作正常。

但是,我想对护照代码进行一些小改动(好吧,不是在供应商文件夹中,我希望),一旦我要求用户更改密码,以防他第一次登录

所以,我需要的是两件事(我相信):

1 - 如何在oauth / token响应中再添加一个信息?与access_token一起,我想从DB中添加一个需要NewPassword = true / false的列。

2 - 如果needsNewPassword为true,则应用程序将重定向到另一个屏幕,用户将在该屏幕上设置新密码。我将设置新密码,删除needsNewPassword的标志并向用户发回新的access_token。然后,用户将仅使用该access_token。如何重新生成新的access_token?

谢谢你的帮助!若昂

3 个答案:

答案 0 :(得分:8)

右,

我回答了我自己的问题,以防有人需要这样做。也许不是最好的方式,但是有效。我做的是:

  • 创建一个新的路由,比如/ api / login指向一个方法(确保它是在你的中间件之外" auth",一旦它没有在你的呼叫中发送令牌)。例如:Route::post('/login', 'Auth\LoginController@apiLogin');
  • 在方法中,您对oauth / token发出请求,并在结果中添加所需的字段。 测试

    function apiLogin(Request $request) {
        $tokenRequest = $request->create('/oauth/token', 'POST', $request->all());
        $request->request->add([
           "client_id"     => 'your_client_id',
           "client_secret" => 'your_client_secret',
           "grant_type"    => 'password',
           "code"          => '*',
        ]);
    
        $response = Route::dispatch($tokenRequest);
        $json = (array) json_decode($response->getContent());
        $json['new_value'] = '123456';
        $response->setContent(json_encode($json));
        return $response
    }
    

    这对我有用。在我的情况下,我也只有一个应用程序,所以我的client_id,client_secret,grant_type和代码都添加到服务器端。客户端只需要传递用户名(或电子邮件,取决于您使用的是什么)和密码,然后它将获得access_token和我想要发送的其他信息。 希望这也有助于其他人。

干杯, 若昂

答案 1 :(得分:0)

@ joao.sauer 您自己的答案就像一个咒语,但是如果您不需要更多自由,则可以扩展Passport自己的AccessTokenController。

一个简单的例子:

use App\Models\User;
use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use League\OAuth2\Server\Exception\OAuthServerException;
use Psr\Http\Message\ServerRequestInterface;
use Response;

class AccessTokenController extends \Laravel\Passport\Http\Controllers\AccessTokenController
{
    public function issueToken(ServerRequestInterface $request)
    {
        try {
            //get username (default is :email)
            $username = $request->getParsedBody()['username'];

            //get user
            $user = User::where('email', '=', $username)->firstOrFail();

            //issuetoken
            $tokenResponse = parent::issueToken($request);

            //convert response to json string
            $content = $tokenResponse->getBody()->__toString();

            //convert json to array
            $data = json_decode($content, true);

            if(isset($data["error"]))
                throw new OAuthServerException('The user credentials were incorrect.', 6, 'invalid_credentials', 401);

            //add access token to user
            $user = collect($user);
            $user->put('access_token', $data['access_token']);

            return Response::json(array($user));
        }
        catch (ModelNotFoundException $e) { // email notfound
            //return error message
        }
        catch (OAuthServerException $e) { //password not correct..token not granted
            //return error message
        }
        catch (Exception $e) {
            ////return error message
        }
    }
}

Messi89的积分: Laravel Passport - Customize The Token Response

答案 2 :(得分:0)

我找到了一个简单的解决方案,不需要新的请求,控制器或扩展,只需添加参数即可通过应用程序请求和调用issueToken,对于初学者来说可能很有用:

0

还可以添加try ... catch块以处理异常,或在发送给客户端之前添加参数以响应

0