有两天我正在挖谷歌,但找不到我的问题的起始线程,现在我没有选择权。请帮我指点方向/如何
我有一个使用laravel 5.3构建的Web应用程序,我已按照here所述安装了护照。如果我完美地展示/home
。
现在我必须制作一个Android应用程序
TaskModel (ons_tasks(id, title, description))
仅与路线相关
web.php中的
Auth::routes();
在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);
});
});
要登录,如果我发送邮件请求/login
并附上电子邮件&密码获取TokenMismatchException
错误,但我在哪里获取令牌
手机中的Android应用程序?我是否也需要api中的Auth::routes()
?
如果那么还有什么我需要登录并获得一个令牌,以便我以后
可以发送它来获取任务列表。
其次,
如果我转到/api/test
,则会将我重定向到/home
页面
显示任何错误!!!
提前致谢。
答案 0 :(得分:6)
在这种情况下,您需要使用密码授予客户端,请参阅this section of Passport's documentation。
生成密码授予客户端后,使用:
php artisan passport:client --password
您需要从您的应用程序请求访问令牌,并将其与您的后续请求一起发送,以便访问受保护的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);
确保您添加上述工匠调用返回的client_secret
和client_id
,并确保username
和password
引用数据库中的有效用户。
如果此处一切正常,您应该在回复中收到access_token
和refresh_token
。 access_token
是您使用auth:api
后卫进行身份验证所需的内容。要将此正确传递回您的API,您需要使用标题Authorization: Bearer <your accessToken>
和Accept: application/json
例如,要访问您的&#34;测试&#34;路线:
$response = $client->request('GET', '/api/test', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '. <accessToken from /oauth/token call>,
],
]);
如果您已正确设置这些,则应该看到您指定的阵列的JSON响应。
您正在请求包含auth:api
中间件的路由。这将重定向您,因为您没有如上所述指定正确的标头,这是预期的行为。
希望这有帮助。