到目前为止没有任何回应,所以我能做的最好的就是确认它实际上确实有效。有关如何设置 Flex Builder 以编写与 Django 页面模板通信的 html-wrapper 的详细信息,请参阅我的另一篇文章。以上是使用上述组合完成的,加上:
做了一个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 中,randomcookie 是查找别名的位置:
<param name="flashVars" value="randomcookie={{randomcookie}}" />
在applicationComplete
中,我们得到 randomcookie 并找到别名,然后使用它登录:
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 上。
任何来自人们的进一步信息将不胜感激,特别是如果有关于此安全方面的真实反馈......