Jun 10 2010

在App Engine上使用OpenID验证登陆 {2}

Google App Engine最新发布的SDK 1.3.4提供了对OpenID的原生支持。下面我们就来演示在app engine上的应用如何使用OpenID来登陆。
首先你需要登陆到App Engine的管理控制台中,在你应用的"Application Settings"中选择"Authentication Options"为 "(Experimental) Federated Login"并保存。

一旦你设置好了上面这一步,App Engine的Users API就能够提供对OpenID的支持了。在使用Users API之前,我们先看看OpenID的登陆流程,我按照自己的理解画了一个示意图。

用户访问web app
web app返回一个登陆表单,提供OpenID identifier的输入框
用户输入OpenID identifier,提交表单
web app根据用户输入的OpenID identifier用create_login_url()函数生成并重定向到OpenID登陆页面
用户在OpenID provider处登陆,并授权web app获取用户的OpenID信息
OpenID provider把用户重定向到web app(重定向的url包含了用户的OpenID信息)
web app通过get_current_user()函数获取到用户信息,登陆完成

上面的流程省略掉了一些步骤和细节,比如web app和OpenID provider的交互,web app对重放攻击的处理等等。这些步骤和细节App Engine全都帮我们做了,所以对web开发者来说是透明的,我们不用去关心。我们需要做的就是第2,4,7步。
提供一个用户登陆页面
准备一个简单login.html文件内容如下,主要就是提供一个能够接收用户OpenID标识的表单。

<html>
<head>
<title>Log in with OpenID</title>
</head>
<body>
<h1>Log in with OpenID</h1>
<form method="get" action="/testopenid">
<input type="text" name="openid" />
<input type="submit" [...]