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

时间:2017-03-09 11:14:48

标签: laravel laravel-5.3 laravel-passport

有两天我正在挖谷歌,但找不到我的问题的起始线程,现在我没有选择权。请帮我指点方向/如何

我有一个使用laravel 5.3构建的Web应用程序,我已按照here所述安装了护照。如果我完美地展示/home

Home page

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

  1. 已有的网络应用用户可以登录
  2. 获取该用户的所有任务列表TaskModel (ons_tasks(id, title, description))
  3. 仅与路线相关

    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页面 显示任何错误!!!

    提前致谢。

1 个答案:

答案 0 :(得分:6)

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

在这种情况下,您需要使用密码授予客户端,请参阅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_secretclient_id,并确保usernamepassword引用数据库中的有效用户。

如果此处一切正常,您应该在回复中收到access_tokenrefresh_tokenaccess_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响应。

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

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

希望这有帮助。