我一直在开发我的rails应用程序,同时尽可能保持模块化.我正在尝试将下面的不同部分实现为服务.
说的Facebook的例子:
a)一个MainApp,允许用户有一个墙,柱等
b)一个PhotoApp存储的照片,使用户可以看到他的照片,等等,这是一个独立的应用程序,将有一个也可以由MainApp使用的REST API.
我正在考虑将OAuth用作单点登录解决方案(如本教程中所述http://blog.joshsoftware.com/2010/12/16/multiple-applications-with-devise-omniauth-and-single-sign-on /)每个应用程序将通过OAuth授权,并将基于cookie访问当前用户会话.
第一个问题:这是可行的解决方案吗?
第二个问题:我希望能够从 MainApp服务器(而不是用户的浏览器)调用 PhotoApp API.如何在这种情况下进行身份验证?
第三个问题:如果说我有一个使用node.js的服务,它将如何工作?
OAuth2的规范规定授权服务器在使用隐式授权时不得发出刷新令牌.在我们的用例中,我们使用OAuth2保护RESTful API,并使用单页Javascript应用程序作为此API的客户端.由于在访问令牌过期后重定向到授权服务器非常困难,我们正在寻找更好的方法来获取新的有效令牌.我可以考虑两种不同的方法,并想知道哪一种可能更好:
使用隐藏的iframe重新请求有效的访问令牌.为此,必须包含一个参数,例如"prompt = none",它告诉OAuth提供者既不挑战认证,也不显示授权页面.如果用户已通过身份验证并已授权应用程序,则服务器将在URL#parameters中发回访问令牌.如果未满足上述条件之一,它将重定向,并出现错误,如#error = authentication%20lost.通过这种行为,我们可以使用具有隐式流的短期访问令牌.
我们可以使用一个额外的范围(例如离线)来告诉服务器分发刷新令牌.即使原始规范说隐式流不会发出刷新令牌(如果客户端仅将OAuth用于第一次授权,这是正确的),您可以自由地为您的特定应用程序定义自己的作用域.您应该考虑仅允许来自知名客户端的此范围.
这两种方法都与OpenID Connect非常相似.不幸的是,目前OpenID Connect的实现并不多.因此,第一步是扩展OAuth2服务器,直到OIC更受欢迎.
那么哪种方法应该首选?
编辑:令牌端点需要客户端身份验证,这仅适用于机密客户端,如服务器端应用程序.使用第二种方法,只有在我们的情况下,RESTful API才能使资源提供者刷新令牌并将其发送回客户端.我认为这会带来安全风险.所以我们可能只有一种有效的方法.
restful-authentication single-sign-on oauth-2.0 single-page-application
我隐约意识到,在加入域的计算机上,可以要求IE发送一些额外的标题,我可以用它来自动登录到应用程序.我用mod_php在windows服务器上运行apache.我希望能够避免用户必要时登录.我发现了一些关于Kerberos和Apache模块的链接.
http://www.onlamp.com/pub/a/onlamp/2003/09/11/kerberos.html?page=last https://metacpan.org/pod/Apache2::AuthenNTLM
由于我在Windows上运行,因此证明安装Perl或Apache模块并非易事.但PHP不能访问HTTP标头吗?
我发现了这个但它没有进行任何身份验证,只是表明PHP可以读取NTLM头文件. http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/
我希望能够让我的用户只指向该应用程序并让它们自动进行身份验证.有没有人有这方面的经验或者让它一起工作?
更新 自从最初发布此问题以来,我们已将设置更改为仍在Windows上运行的nginx和php-fcgi.Windows上的Apache2和php-cgi可能是您在Windows上配置的最慢设置之一.它看起来可能仍然需要Apache(它适用于php-fcgi)但我更喜欢nginx解决方案.
我还是不明白(并希望接受教育)为什么HTTP服务器插件是必要的,我们不能拥有PHP,Web服务器无关的解决方案.
我正在开始为项目添加SAML SSO支持,我正在寻找专门针对PHP的有用资源.我理解了基本的概念,并且已经开始探索任何可以提供帮助但却空洞的库.我发现的唯一的东西是simpleSAMLphp,它似乎是一个完整的堆栈.
有关将SAML集成到现有项目的任何提示吗?Zend-Framework相关建议的奖励积分!
OpenID是否改善了用户体验?
编辑
不要贬低其他评论,但我在下面得到了一个非常好的回复,概述了OpenID在理性底线方式中的3个优点.我还听到其他评论中的一些低语,你可以通过OpenID访问用户的一些细节(名称?电子邮件?什么?),使用它甚至可以通过不需要收集来简化注册过程尽可能多的信息.
在结账过程中肯定需要收集的东西:
(我很确定我自己要问这些)
从营销的角度来看,可能还有其他一些有趣的事情,但我不会要求用户手动输入在结账过程中不是绝对必需的任何内容.那么这方面有什么可能呢?
/编辑
(您可能已经注意到stackoverflow使用OpenID)
在我看来,用户只需输入他们必须经历的注册表单中的用户名和密码就更容易,更快捷.我的意思是你不要避免使用OpenID输入用户名和密码.但是,您可以避免选择OpenID提供商的混乱,以及从外部站点到外部和外部的旅程.
由于微软将Live ID作为OpenID提供商(更多信息),为Google,雅虎和其他公司提供的额外帐户增加了数亿个,这个问题比以往任何时候都更加重要.
我必须要求新客户在结账过程中进行注册,并且尽可能简单,顺利地进行体验绝对至关重要,每一点点都会变得难以转化为销售损失.在一天结束时,没有极客因素超过冷硬现金:)
OpenID似乎是一个不错的主意,但实现的价值有问题.OpenID的优点是什么?在我上面描述的场景中它真的值得吗?
我只是在寻找不同的意见.你认为OpenID是一个很好的"单点登录"解决方案吗?
它的工作方式似乎对普通用户来说有点混乱,并且可能存在与"将所有鸡蛋放在同一个篮子里"相关的问题.
无论如何,有没有人试图在Intranet的上下文中实现自己的OpenId解决方案,其中有许多不同的应用程序(Wordpress,Elgg,Media Wiki,..)??
我认为这可能是解决"数字身份"问题的一个很好的解决方案,但我不知道它是否适用于"登录一次并浏览内联网"问题.
意见?
我对iOS 7中的一项新功能 - 单点登录有疑问.
有没有关于它的详细信息?有人已经尝试过实施吗?我搜索了很多文章和文档 - 但没有发现任何有用的东西.我也没有找到关于Apple和Developers Apple资源的任何详细信息.在iOS 7 GM版本中没有SSO的可视化设置(我不确定它是否应该存在).
所以我的问题是 - 有人已经调查过它,可能有人可以分享一些链接和有用的信息吗?是否有关于此功能的任何技术说明,是否存在iOS 7 GM中的某些功能?
提前致谢.
我正在使用WSO2 Identity Server进行单点登录实现.
在我的演示应用程序中,我试图从我自己的JDBC数据库中获取经过身份验证的用户的自定义声明属性.
我关注了Pushpalanka的这个博客.
这适用于Identity Server 5.0.0
但是当我使用最新更新"WSO2-IS-5.0.0-SP01"更新Identity Server时,自定义声明处理已停止工作.
以下是错误堆栈:
[2015-04-22 19:09:43,411] ERROR {org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.DefaultStepBasedSequenceHandler} - 声明处理失败!org.wso2.carbon.identity.application.authentication.framework.exception.FrameworkException:索引:0,大小:0,位于com.wso2的com.wso2.sample.claim.handler.CustomClaimHandler.handleLocalClaims(CustomClaimHandler.java:200) .sample.claim.handler.CustomClaimHandler.handleClaimMappings(CustomClaimHandler.java:66)在org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.DefaultStepBasedSequenceHandler.handleClaimMappings(DefaultStepBasedSequenceHandler.java:604)在有机.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.DefaultStepBasedSequenceHandler.handlePostAuthentication(DefaultStepBasedSequenceHandler.java:394)在org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl. DefaultStepBasedSequenceHandler.handle(DefaultStepBasedSequenceHandler.java:134)at org.wso2.carbon.identity.application.authentication.framework.handler.request.impl.DefaultAuthenticationRequestHandler.handle(DefaultAuthenticationReques)tHandler.java:121)在org.wso2.carbon.identity.application.authentication的org.wso2.carbon.identity.application.authentication.framework.handler.request.impl.DefaultRequestCoordinator.handle(DefaultRequestCoordinator.java:94). framework.servlet.CommonAuthenticationServlet.doPost(CommonAuthenticationServlet.java:54)在javax.servlet.http.HttpServlet.service(HttpServlet.java:755)在javax.servlet.http.HttpServlet.service(HttpServlet.java:848)在组织位于org.eclipse.equinox.http的org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61)的.eclipse.equinox.http.helper.ContextPathServletAdaptor.service(ContextPathServletAdaptor.java:37)位于org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60)的.avlet.internal.ProxyServlet.processAlias(ProxyServlet.java:128),位于javax.servlet.http.HttpServlet.service(HttpServlet) .java:848)org.apac的org.wso2.carbon.tomcat.ext.servlet.DelegationServlet.service(DelegationServlet.java:68)he.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)位于org.wso2.carbon.tomcat.ext.filter.CharacterSetFilter的org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210).的doFilter(CharacterSetFilter.java:61)在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)在org.apache .catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java :472)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)at org.wso2.carbon.tomcat. org.ws上的ext.valves.CompositeValve.continueInvocation(CompositeValve.java:178)在org.wso2.carbon.tomcat的org.wso2.carbon.webapp.mgt.TenantLazyLoaderValve.invoke(TenantLazyLoaderValve.java:56)上的o2.carbon.tomcat.ext.valves.CarbonTomcatValve $ 1.invoke(CarbonTomcatValve.java:47)位于org.wso2.carbon.tomcat.ext.valves的org.wso2.carbon.tomcat.ext.valves.CompositeValve.invoke(CompositeValve.java:141)的.ext.valves.TomcatValveContainer.invokeValves(TomcatValveContainer.java:47) .CarbonStuckThreadDetectionValve.invoke(CarbonStuckThreadDetectionValve.java:156)org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)org.wso2.carbon.tomcat.ext.valves.CarbonContextCreatorValve.invoke(CarbonContextCreatorValve.java) :52)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)org.apache.coyote.http11. AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProt)ocol.java:589)在java.util的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)的org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1653) .concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:745)引起:java.lang.IndexOutOfBoundsException:索引:0,大小:0,java.util位于org.wso2.carbon.claim.mgt.ClaimManagerHandler.validateClaims(ClaimManagerHandler.java:668)的java.util.ArrayList.get(ArrayList.java:411)中的.ArrayList.rangeCheck(ArrayList.java:635). wso2.carbon.claim.mgt.ClaimManagerHandler.getMappingsFromOtherDialectToCarbon(ClaimManagerHandler.java:529)在org.wso2.carbon.claim.mgt.ClaimManagerHandler.getMappingsMapFromOtherDialectToCarbon(ClaimManagerHandler.java:614)在com.wso2.sample.claim.handler. CustomClaimHandler.handleLocalClaims(CustomClaimHandler.java:141).
根据我对Identity Server源代码的研究,这个问题出现在org.wso2.identity.application.authentication.framewotk组件的 Authentication Framework中.
问题可能在于验证声明,但我没有在源代码中找到任何名为validateClaims的方法.
在博客文章中给出的源代码中,使用了Authentication Framework版本 - 4.2.2.
我尝试使用最新版本的Authentication Framework - 4.2.3.
但问题仍然存在于同一个组件中.
我仍然在努力.我需要一些指导.
如果我遗失了某些事情,或者你们中的任何人遇到同样的问题,请有人帮忙.
谢谢.
我有一个小问题.
如何为多个域设置cookie?
我确实理解安全问题,我相信它以前已经完成了.原因是SSO.
即.
account.domain.com
将需要设置登录的域名:
domain.com,domain1.com,domain2.com.
有没有简单的方法,使用PHP和cookie,或任何替代方案?
我应该使用哪种CAS实现来启用CAS单点登录到我的django应用程序(trusing指定的CAS服务器,我对创建CAS提供程序不感兴趣)?我能找到的是以下内容:
我之前使用过django-cas,似乎有效,但似乎有点被遗弃?django-cas-consumer至少似乎有更近期的活动.
每种实施的实际利弊是什么?我应该使用其他实现吗?