Symfony2 通过第 3 方 REST API 进行身份验证

Posted

技术标签:

【中文标题】Symfony2 通过第 3 方 REST API 进行身份验证【英文标题】:Symfony2 authentication via 3rd Party REST API 【发布时间】:2013-02-02 10:10:29 【问题描述】:

我正在使用 Symfony2 编写一个应用程序,它将与 Wordnik REST API 接口。

目前,Wordnik API 不提供 OAuth 功能,因此我必须接受用户名和密码,然后我会透明地将其传递给 API 接口。

我想将此 API 身份验证集成到 Symfony2 的安全系统中,但到目前为止我还无法确定最佳实现路线是什么。

我认为custom user provider 不正确,因为密码没有存储在我的系统中。所有关于custom authentication providers 的示例似乎都与保护应用程序的一部分作为 API,而不是针对 REST API。

我也不清楚 FOSUserBundle 在多大程度上有助于解决这个问题。

理想的流程:

用户提供凭据。 凭据传递给第 3 方 REST API 如果凭据正确: 相应的“第三方用户”实体由我的应用程序创建(如果不存在)。 使用此“第三方用户”实体对用户进行身份验证。

在 Symfony2 安全上下文中实现这一点的最佳方式是什么?

谢谢!

相关问题:

Problems configuring user authentication by external API on Symfony2

【问题讨论】:

我正在努力解决同样的问题。您能否分享您的代码以了解您是如何实现的? @Steffan - 自编写此代码以来已经持续了 2 年,但您可以在此处看到我们编写的提供程序/令牌:github.com/freen/wordrot/tree/… .... 在随后的提交中,我删除了 php 后端赞成尝试使用 Node 后端,因此提交是 PHP 的最后一个状态。 非常感谢,但我发现了一种更简单的方法,可以使用 guard system thx 到 @DevDonkey 的 this 帖子。 【参考方案1】:

您必须实现自定义身份验证提供程序,如下所述: http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html

我无法告诉您最好的方法是什么,只是为了帮助您入门: 你创建了一个监听器、一个令牌、一个提供者和一个工厂。

侦听器的尝试身份验证方法获取用户提供的凭据并使用该输入创建一个新令牌。在方法的最后,您将添加: return $this->authenticationManager->authenticate($token);

您的提供商将在身份验证方法中使用此令牌来发送 API 请求。

对于不存在的用户,您有两种选择: - 在 API 调用之后并在您检查它是否已经存在之后,在身份验证方法中创建一个用户,我认为这不是他们要走的路 - 创建您自己的身份验证失败处理程序,类似于https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php,但位于您添加的 onAuthenticationFailure 方法的顶部 if ($exception instanceof UsernameNotFoundException && (null !== $token = $exception->getToken()) && $token instanceof YourWordnikToken) // 在此处创建该用户

这只是它的基本原理...我在 IRC 上,昵称 hacfi - 如果您需要进一步的指导,请告诉我

【讨论】:

嘿 hacfi,我现在在频道里看不到你 :) 你可以在这里找到我的应用程序代码:github.com/freen/wordrot ...我目前收到此错误:Fatal error: Cannot access parent:: when current class scope has no parent in /[...]/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php on line 43 ...如果它仍在尝试使用 UserAuthenticationProvider (应该使用 WordnikProvider),配置似乎略有偏差——你看到我的实现有什么问题吗? 我将把仓库克隆到今晚并尝试修复它! 嗨哈菲,感谢您的帮助!我在您的拉取请求中合并,solved a constructor argument error on the authentication provider,但我仍然收到与以前完全相同的错误。 查看 pullrequest...下一点: - 处理令牌 - 添加 api 调用以在 WordnikProvider 中进行身份验证 我不认为这是正确的 - 应用程序似乎加载了 Dao,而后者又加载(扩展)了 UserAuthenticationProvider。 See the full stacktrace. 但是 WordnikProvider 并没有扩展该提供程序,而是 directly implements the AuthenticationProviderInterface。这就是为什么我认为错误出在实现的配置中,并且 WordnikProvider 永远不会加载。

以上是关于Symfony2 通过第 3 方 REST API 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

当第 3 方系统使用 REST API 时,BizTalk Server 是不是支持通过 Azure 文件共享交换大文件?

Symfony2 Form + AngularJS for REST API = 表单验证额外字段错误

是否可以通过 GraphQL/REST 后端共享 3rd 方 API websocket/实时连接?

使用 Angular JS、cors 调用 symfony 2 rest api

如何从 REST API 传递类别属性值

从 Django Rest Framework SIMPLE JWT 令牌(第 3 方)获取中间件中的用户名