我正在开发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重定向到移动应用程序感到困惑
答案 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 /移动呼叫者。