如何使用auth服务器的Oauth2访问令牌来授权资源/应用服务器中的用户?

时间:2017-07-29 12:52:52

标签: php laravel authentication oauth-2.0 lumen

我正在使用laravel / lumen应用程序实现SSO。我有以下几点。

  1. laravel上的Auth服务器(中央用户目录,使用laravel / passport的OAuth2)
  2. 流明上的资源服务器(Web应用程序,无用户表)
  3. 客户端JS应用程序(ReactJS)
  4. 工作流程:

    1. 客户端上的登录按钮转到auth服务器,oauth2客户端由用户授权并获取auth_code并重定向回客户端。
    2. 客户端然后使用POST请求将数据发送到追索服务器,后者从auth服务器获取access_tokenrefresh_token
    3. 下一步是使用auth服务器access_token在资源服务器(App服务器)上授权用户。我需要它无国籍(JWT?)
    4. 这是一个详细的流程图:

      enter image description here

1 个答案:

答案 0 :(得分:1)

获得access_token后,您必须将授权标头发送回auth服务器,并且您可以使用自定义中间件或控制器操作来验证和授权用户。

简单的工作流程可能是这样的:

假设您使用axios库向auth服务器API发送HTTP请求,并且虚构路由为api/user/authorize,那么在前端应用中:

axios({
    method: 'get',
    url: `http://localhost:8000/api/user/authorize`,
    headers: {
        'Accept': 'application/json',
        'Authorization': `Bearer ${access_token}`
    }
})
.then( response => {
    // stuff to do on success
})
.catch( error => {
    // stuff to do on failure
});

<强>路由/ api.php:

Route::get('user/authorize', 'UserController@isAuthorized');

<强> UserController.php:

public function isAuthorized(Request $request)
{
  // Retrieving user based the on provided authorization header
  $user = Auth::guard('api')->user();

  // In case of no-user
  if (!$user) {
    return response()->json([
      'isAuthorized' => false
    ], 401);
  }

  return response()->json([
    'isAuthorized' => true
  ], 200);
}

这也可以通过许多其他方式完成。希望你明白这个想法!