首先,如果有一种真正的官方方法让flash/flex的NetConnection篡夺周围网页的会话/cookie状态,那么如果用户已经登录,他们就不需要再提供凭据来建立AMF连接,请现在就停止我并发布官方答案。
除此之外,我认为不存在,因为我已经搜索过,而且它似乎不存在。我已经想出了一种方法来做这件事,但是想要一些关于它是否安全的反馈。
访问闪存对象的包装器-页的
ExternalInterface调用java在该随机cookie位置获取值,然后删除cookieh 118在网关端,pyamf查找会话别名并获取它指向的会话,
NetConnection上,以便进一步验证调用(如果一个连接按照正常的方式使用用户名和密码进行身份验证,这肯定是有效的,所以我认为这是一个安全的打赌,测试很快就会证明或否定这一点)那么,这是不安全的,还是工作正常?据我所知,由于html页面保证通过ssl,所以密钥和cookie数据应该是加密的,而不是可窃取的。然后,其中的信息应该可以安全地使用一次作为临时密码,再次通过ssl发送,因为网关也是https。之后,它在https上使用普通的pyAMF系统,而不是做任何异常的事情。
发布于 2010-08-25 21:35:30
到目前为止,还没有人对此做出反应,所以我能做的最好的就是确认它实际上是体力劳动。有关如何设置Flex以编写与Django页面模板通信的html-包装器的详细信息,请参阅my other post。以上工作是通过上述两项结合来完成的,加上:
制作了一个SessionAlias模型:
class SessionAlias(models.Model):
alias = models.CharField( max_length=40, primary_key=True )
session = models.ForeignKey( Session )
created = models.DateTimeField( auto_now_add=True )Flex指向一个Django页面,该页面通过包含以下内容的视图加载:
s = SessionAlias()
s.alias = SessionStore().session_key // generates new 40-char random
s.session = Session.objects.get( session_key=request.session.session_key )
s.save();
randomcookie = SessionStore().session_key // generates new 40-char random
kwargs['extra_context']['randomcookie'] = randomcookie
response = direct_to_template( request, **kwargs )
response.set_cookie( randomcookie, value=alias )在flex html包装器中,随机wrapper是查找别名的位置:
<param name="flashVars" value="randomcookie={{randomcookie}}" />在applicationComplete中,我们获得随机并找到别名,并使用它登录:
var randomcookie:String = this.parameters["randomcookie"];
// randomcookie is something like "abc123"
var js:String = "function get_cookie(){return document.cookie;}";
var cookies:String = ExternalInterface.call(js).toString();
// cookies looks like "abc123=def456; sessionid=ghi789; ..."
var alias:String = // strip out the "def456"
mynetconnection.call( "loginByAlias", alias, successFunc, failureFunc );然后访问这个pyamf网关rpc:
from django.contrib.auth import SESSION_KEY, load_backend
from django.contrib.auth.models import User
from django.contrib import auth
from django.conf import settings
def loginByAlias( request, alias ):
a = SessionAlias.objects.get( alias=alias )
session_engine = __import__( settings.SESSION_ENGINE, {}, {}, [''] )
session_wrapper = session_engine.SessionStore( a.session.session_key )
user_id = session_wrapper.get( SESSION_KEY )
user = User.objects.get( id=user_id )
user.backend='django.contrib.auth.backends.ModelBackend'
auth.login( request, user )
a.delete()
return whateverToFlash在那一点上,在flash/flex方面,特定的mynetconnection保留会话cookie状态,该状态可以进行以后的调用,这样,在网关内部,request.user首先是登录到网页的经过适当身份验证的用户。
请再次注意,flex的运行/调试设置必须使用https,以及NetConnection的网关设置。在发布此版本时,我必须确保通过身份验证的用户保留在https上。
如果有关于安全方面的真实反馈,我们将不胜感激.
发布于 2011-06-03 20:19:29
IE在本地开发中不允许访问cookie,但是如果您发布SWF并放入域,它应该像其他浏览器一样拾取会话。使用Firefox 3.6在本地构建您的flex应用程序。
在IE8中进行测试,火狐使用NetConnection在Flex 3上使用pyamf网关。网关功能使用@login_required装饰。
https://stackoverflow.com/questions/3553376
复制相似问题