从oauth login返回JWT令牌到javascript SPA

时间:2017-05-18 19:01:18

标签: laravel cordova oauth vue.js jwt

我正在开发vue.js中的javascript spa,最终将成为一个cordova应用程序。以及用流明构建的后端api。

我试图提供登录Facebook和谷歌功能。我添加了laravel socialite包并创建了重定向和回调路由。我已经在我的水疗中心创建了一个页面,其中包含指向我的api重定向的登录按钮。用户被重定向到我登录的facebooks oauth机制,回调路由句柄功能看起来像这样

public function handleProviderCallback($provider)
{
  $oauthUser = $this->socialiteManager->with($provider)->stateless()->user();

  $userEntity = $this->repository->findOrCreateOauthUser($oauthUser);

  $providerEntity = app()
    ->make('em')
    ->getRepository('Entities\Social\Provider')
    ->findOneBy(['name' => $provider]);

  if(is_null($providerEntity))
  {
    throw new \Exception('Oauth Provider not found');
  }

  $socialAccountEntity = app()
    ->make('em')
    ->getRepository('Entities\Social\SocialAccount')
    ->findOrCreateSocialAccount($providerEntity, $oauthUser, $userEntity);  

  $token = $this->auth->fromUser($userEntity);

  $resource = $this->item($token)
      ->transformWith($this->transformer)
      ->serializeWith(new ArraySerialization())
      ->toArray();

  return $this->showResponse($resource);
}

它基本上是一个oauth用户,在数据库中查找或存储它们,查找或存储他们的社交帐户信息,

$token = $this->auth->fromUser($userEntity);

然后使用JWT发出令牌对它们进行身份验证。然后将其序列化并作为json响应返回。

问题是在后端应用程序上给出了响应,我从未返回到javascript SPA。

我没有返回json,而是可以像

那样进行重定向
return redirect()->to('/some-spa-callback-route');

但api应该知道SPA的位置吗?当SPA被移植到cordova时,这将如何工作,因为移动应用程序没有网址?

我的想法是A

社交提供者应该直接重定向到SPA,此时它应该发出另一个请求来交换JWT令牌的授权代码。

B它使用包含令牌的查询字符串重定向到SPA,这听起来不安全。

或c发回某种类型的cookie。

我仍然对如何从我的api重定向到移动应用程序感到困惑

2 个答案:

答案 0 :(得分:3)

最后,我最终得到了以下登录流程

用户被定向到Oauth提供商 Oauth提供程序向客户端返回访问令牌 客户端将访问令牌发送到我的api 我的api向Oauth提供商发送续订请求 Oauth提供程序验证令牌并将新的令牌返回给我的api 我的api交换了访问令牌以获取jwt令牌 我的api将jwt令牌返回给客户端

在我看来,这是验证SPA应用程序的唯一正确方法,重要的是更新客户端提供的Oauth令牌,而不是盲目地交换jwt,因为您不能信任客户端,并且优于发布重定向来自不太安静的api

答案 1 :(得分:0)

您的水疗中心应该与您后端的单个身份验证服务进行通信,而不是处理2项服务。您将服务注册为oauth回调,并按照您的描述处理oauth / jwt。您的身份验证服务也可以作为用户(重新)身份验证的决策点。由于您的前端直接调用您的后端,您现在可以将json有效负载返回给您的Web /移动呼叫者。