【发布时间】:2011-10-29 14:51:41
【问题描述】:
我正在为我的书签扩展程序开发用户身份验证。该扩展可与http://ting-1.appspot.com/ 的 Google App Engine (Python) 后端配合使用。
第一次运行扩展程序时,background.html 在新选项卡中打开options.html,用户输入他的电子邮件地址。我将电子邮件地址发送到这样的应用程序(尚未尝试):
in options.html
---------------
var formData = new FormData();
formData.append("extension_user", userEmail);
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://ting-1.appspot.com/authsender", true);
xhr.send(formData);
在应用程序中,处理程序AuthSender 向用户发送确认电子邮件:
class AuthSender(webapp.RequestHandler):
def post(self):
new_user = self.request.get("extension_user")
mail.send_mail(
sender="Ting <ting@gmail.com>",
to=new_user,
subject="Ting Bookmarking: confirm your email",
body="""click on the link below to confirm your email:
<a href="http://ting-1.appspot.com/authHandler"></a>
Happy Bookmarking!""")
如果用户单击应用程序中电子邮件AuthReceive 中的链接,处理程序将处理请求并向扩展程序发送确认。但我不知道如何将确认发送到分机。
当用户点击链接时,我如何将确认发送回扩展程序?我是否再次使用XMLHttpRequest?如何?我需要在扩展程序中放置什么样的监听器?
下面是应用程序中AuthReceive 处理程序的草图:
class AuthReceive(InboundMailHandler):
def receive(self, message):
#---------------------------------------
#receive email // I know this part
#send confirmation to extension // I need help with this
#--------------------------------------
...
在 background.html 中
//...
// add listener and save the variable to localStorage
//...
感谢您的帮助。
更新
这是符合Moishe's answer 的代码。除了最后一步,一切正常:handler.onmessage 未被触发。
options.html
<html>
<head><title>Extension Options</title></head>
<body>
<p>Enter your gmail address:</p>
<textarea id="getEmail" style="margin-bottom: 4px; width: 250px; height: 20px">
</textarea><br />
<button id="save">Save</button>
<!--<button id="save">Clear</button>-->
<script type="text/javascript">
document.getElementById("getEmail").placeholder = "your gmail address" ;
//send entered gmail address to the server
document.getElementById("save").addEventListener
(
"click",
function ()
{
var userEmail = document.getElementById("getEmail").value;
var formData = new FormData();
formData.append("extension_user", userEmail);
var channel;
var socket;
var handler = new Object();
handler.onmessage =
function (evt)
{
//evt.data will be what the server sends in channel.send_message
console.log("evt.data received from authhandler: " + evt.data);
};
var xhr = new XMLHttpRequest();
xhr.onReadyStateChange = function()
{
//error handling etc not included
if (xhr.readyState == 4 && xhr.status == 200)
{
token = xhr.responseText;
channel = new goog.appengine.Channel(token);
socket = channel.open(handler);
}
};
xhr.open("POST", "http://ting-1.appspot.com/authsender", true);
xhr.send(formData);
console.log("formData sent to authsender: " + formData);
}, false
)
//...
</script>
</body>
</html>
AuthSender 和 AuthHandler
class AuthSender(webapp.RequestHandler):
def post(self):
new_user = self.request.get("extension_user")
link = "http://ting-1.appspot.com/authhandler?new_user=%s" % new_user
message = mail.EmailMessage()
message.sender="Ting <ting@gmail.com>"
message.to=new_user
message.subject="Ting Bookmarking - Confirm your email"
message.body="""Click on the link to confirm your email: %s """ % link
message.send()
logging.info("message sent to: %s " % message.to)
token = channel.create_channel(new_user)
self.response.out.write(token)
class AuthHandler(webapp.RequestHandler):
def get(self):
new_user = self.request.get("new_user")
channel.send_message(new_user, new_user)
logging.info("new_user sent to client: %s" % new_user)
工作版
options.html
<html>
<head>
<title>Extension Options</title>
<!-- this does not work because it is local url
<script type="text/javascript" src="/_ah/channel/jsapi"></script>
-->
<script type="text/javascript" src="https://talkgadget.google.com/talkgadget/channel.js"></script>
</head>
<body>
<p>Enter your gmail address:</p>
<textarea id="getEmail" style="margin-bottom: 4px; width: 250px; height: 20px">
</textarea><br />
<button id="save">Save</button>
<script>
document.getElementById("getEmail").placeholder = "your gmail address" ;
document.getElementById("save").addEventListener
(
"click",
function ()
{
var userEmail = document.getElementById("getEmail").value;
var formData = new FormData();
formData.append("extension_user", userEmail);
var channel;
var socket;
var handler =
{
onopen: function () { alert("onopen") },
onerror: function () { alert("onerror") },
onclose: function () { alert("onclose") },
onmessage:
function (evt)
{
alert("evt.data is: " + evt.data)
}
};
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4 && xhr.status == 200)
{
token = xhr.responseText;
channel = new goog.appengine.Channel(token);
socket = channel.open(handler);
}
};
xhr.open("POST", "http://ting-1.appspot.com/authsender", true);
xhr.send(formData);
}, false
)
</script>
</body>
</html>
AuthSender 和 AuthHandler
class AuthSender(webapp.RequestHandler):
def post(self):
new_user = self.request.get("extension_user")
link = "http://ting-1.appspot.com/authhandler?new_user=%s" % new_user
message = mail.EmailMessage()
message.sender="Ting <ting@gmail.com>"
message.to=new_user
message.subject="Ting Bookmarking - Confirm your email"
message.body="""Click on the link to confirm your email: %s """ % link
message.send()
token = channel.create_channel(new_user)
self.response.out.write(token)
class AuthHandler(webapp.RequestHandler):
def get(self):
new_user = self.request.get("new_user")
self.response.out.write(new_user)
channel.send_message(new_user, new_user)
【问题讨论】:
-
“电子邮件”是指“电子邮件地址吗?”
-
@kindall;是的,谢谢你的澄清。我建议在应用程序的
AuthReceive处理程序中获取用户的电子邮件地址,例如userEmail = message.sender,并将此信息发送到扩展程序。我正在尝试找出如何将userEmail发送到分机。再次感谢。 -
您坚持尝试制定自己的身份验证解决方案。 Chrome-to-Phone 有什么问题?
-
@Nick Johnson,我确信 Chrome 到手机的身份验证解决方案没有任何问题。但是我无法使用它有几个原因: 1. 我什至无法弄清楚要读取哪个源文件。 2. 在我尝试阅读的文件中,我无法将与 auth 相关的内容与其余代码分开,以便我可以尝试使用它 3. 我不明白为什么我需要使用 OAuth试图访问用户的任何私人数据 4. 在我的情况下,我不知道哪个是消费者,哪个是服务提供者。再次感谢您对此的帮助。
-
@Zeynel 1. this 将是一个很好的起点。 2.然后问具体的问题如何理解代码! 3. 因为您正在访问用户的私人数据 - 您正在存储和检索书签。那应该使用身份验证。 4. 你的扩展是消费者。
标签: javascript python google-app-engine google-chrome-extension