使用laravel 5.3护照从Android应用程序登录API

Ati*_*qur 5 laravel laravel-5.3 laravel-passport

两天我正在挖谷歌,但无法找到我的问题的起始线程,现在我没有选择.请帮我一些方向/如何

我有一个使用laravel 5.3构建的Web应用程序,我已按照此处的说明安装了护照.如果我/home完美展现它.

主页

现在我必须制作一个Android应用程序

  1. 已存在的Web应用程序用户可以登录
  2. 获取该用户的所有任务列表 TaskModel (ons_tasks(id, title, description))

路线仅相关

在web.php中

Auth::routes();
Run Code Online (Sandbox Code Playgroud)

在api.php中

Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware('auth:api');


Route::group(['middleware' => ['auth:api']], function () {

    Route::get('/test', function (Request $request) {
        return response()->json(['name' => 'test']);
    });

    Route::get('/task/list', function (Request $request) {        
        $list = \App\Model\TaskModel::all();
        return response()->json($list);
    });

});
Run Code Online (Sandbox Code Playgroud)

要登录:如果我发送/login带有电子邮件和密码的帖子请求,则会收到TokenMismatchException错误但是我在哪里可以获得Android应用程序的令牌?我也需要Auth::routes()在api中吗?如果那么还有什么我需要登录并获得一个令牌以便稍后我可以发送它来获取任务列表.

其次,

如果我去 /api/test它重定向我的/home页面没有显示任何错误!

提前致谢.

Aar*_*hey 6

使用支持Passport的API进行身份验证

在这种情况下,您需要使用密码授予客户端,请参阅Passport文档的此部分.

生成密码授予客户端后,使用:

 php artisan passport:client --password
Run Code Online (Sandbox Code Playgroud)

您需要从应用程序请求访问令牌,并将其与后续请求一起发送,以便访问受保护的auth:api中间件路由.

要获取访问令牌,请向您的应用程序/oauth/token路由发送请求(显然,这是一个PHP实现,确保您在Java实现中正确格式化请求):

$http = new GuzzleHttp\Client;

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => '<client id returned from the artisan command above>',
    '    client_secret' => '<secret returned from artisan command above>',
        'username' => 'taylor@laravel.com',
        'password' => 'my-password',
        'scope' => '',
    ],
]);

return json_decode((string) $response->getBody(), true);
Run Code Online (Sandbox Code Playgroud)

确保您添加client_secretclient_id一个从工匠拨打以上返回,并确保usernamepassword引用您的数据库的有效用户.

如果一切顺利这里,你应该得到的access_token,并refresh_token在响应中.这access_token是您使用auth:api后卫进行身份验证所需要的.要正确地传递这回你的API,你将需要与标题发送您的后续请求Authorization: Bearer <your accessToken>Accept: application/json

例如,要访问"测试"路线:

$response = $client->request('GET', '/api/test', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '. <accessToken from /oauth/token call>,
    ],
]);
Run Code Online (Sandbox Code Playgroud)

如果您已正确设置这些,则应该看到已指定数组的JSON响应.

为什么/ api/test重定向我没有错误?

您正在请求具有auth:api中间件的路由.这将重定向您,因为您没有如上所述指定正确的标头,这是预期的行为.

希望这可以帮助.