比較修改

快速指南

版本 361767:

Revision 361767 by titus611 on

版本 362187:

Revision 362187 by Dwchiang on

標題:
Quick Setup
Quick Setup
URL代稱:
Persona/Quick_Setup
Persona/Quick_Setup
內容:

修訂版本 361767
修訂版本 362187
n8      Adding the Persona login system to your site takes just fivn8      要把 Persona 登录系统添加到你的站点只需要 5 步:
>e steps: 
n11      <li>Include the Persona JavaScript library on your pages.n11      <li>在你的页面中包含 Persona 的 JavaScript 库。
n13      <li>Add “login” and “logout” buttons.n13      <li>添加“登入”和“登出”按钮。
n15      <li>Watch for login and logout actions.n15      <li>监视登入和登出行为。
n17      <li>Verify the user’s credentials.n17      <li>验证用户证书。
n19      <li>Review best practices.n19      <li>回顾最佳实现。
n23      You should be able to get up and running in a single afternn23      你应该能在一个下午就建立好并运行,但重要的是:如果你要在你的站点上使用 Persona,请花一点时间订阅 <a hre
>oon, but first things first: If you’re going to use Persona on yo>f="https://mail.mozilla.org/listinfo/persona-notices">Persona 通知<
>ur site, <em>please</em> take a moment and subscribe to the <a hr>/a> 邮件列表。它流量非常低,只用于通知那些对你站点有负面影响的变更或安全问题。
>ef="mailto:stylinstephen20022000@yahoo.com?subject=Greetings&amp; 
>body=Hellow%2C%20world!">Persona notices</a> mailing list. It’s e 
>xtremely low traffic, only being used to announce changes or secu 
>rity issues which may adversely impact your site. 
24    </p>
25    <h2 id="Step_1.3A_Include_the_Persona_library">
26      Step 1: Include the Persona library
27    </h2>
28    <p>24    </p>
29      Persona is designed to be browser-neutral and works well on25    <h2 id=".E6.AD.A5.E9.AA.A41.EF.BC.9A.E5.8C.85.E5.90.AB_Person
> <a href="https://developer.mozilla.org/docs/persona/Browser_comp>a_.E5.BA.93">
>atibility">all major desktop and mobile browsers</a>. 
26      步骤1:包含 Persona 库
27    </h2>
30    </p>28    <p>
29      Persona 被设计为跨浏览器且可在<a href="https://developer.mozilla.org/d
 >ocs/persona/Browser_compatibility">全部主要桌面和移动浏览器</a>中工作。
31    <p>30    </p>
32      In the future we expect browsers to provide native support 
>for Persona, but in the meantime we provide a JavaScript library  
>that fully implements the user interface and client-side part of  
>the protocol. By including this library, your users will be able  
>to sign in with Persona whether or not their browser has native s 
>upport. 
33    </p>31    <p>
32      在未来我们期望浏览器提供 Persona 的原生支持,但我们同时提供了一个 JavaScript 库完整地实现了用户界
 >面和客户端部分的协议。通过包含这个库,你的用户会可以用 Persona 登入,无论他们的浏览器是否有原生支持。
34    <p>33    </p>
35      Once this library is loaded in your page, the Persona funct
>ions you need ({{ domxref("navigator.id.watch()", "watch()") }},  
>{{ domxref("navigator.id.request()", "request()") }}, and {{ domx 
>ref("navigator.id.logout()", "logout()") }}) will be available in 
> the global <code>navigator.id</code> object. 
36    </p>34    <p>
35      一 旦页面中的这个库加载完毕,你需要的 Persona 函数({{ domxref("navigator.id.wat
 >ch()", "watch()") }}、{{ domxref("navigator.id.request()", "reques
 >t()") }} 和 {{ domxref("navigator.id.logout()", "logout()") }})会在全
 >局对象 <code>navigator.id</code> 中可用。
37    <p>36    </p>
38      To include the Persona JavaScript library, you can place th
>is <code>script</code> tag at the bottom of the page body: 
39    </p>37    <p>
40    <pre class="brush: html;" style="left: 1px; top: 194px;">38      要包含 Persona JavaScript 库,你可以把这个 <code>script</code> 标签放进你页面
 >的首部:
41&lt;
42</pre>
43    <ol>
44      <li>Choose a career to research.
45      </li>
46      <li>Visit five Web sites related to the career you’ve selec
>ted. A good place to start is the <a href="http://learningresourc 
>es.everest.edu/" jquery1362097882864="2" target="_blank"><u><font 
> color="#0066CC">Everest Career Education Network</font></u></a>, 
> Resources by Program tab. Explore five Web sites, either through 
> the links provided on the Everest Career Education Network site  
>or from a search using your browser. Look for answers to the ques 
>tions that you are required to discuss in your paper. 
47      </li>
48      <li>Choose the three sites you feel will be most helpful.
49      </li>
50      <li>Using Microsoft Word, prepare a document that includes 
>the following: 
51        <ul>
52          <li>Author of the article or Web page. Sometimes the au
>thor is an organization. 
53          </li>
54          <li>Date the Web page was published. Try scrolling all 
>the way down to the bottom of the page to find this. 
55          </li>
56          <li>Title of the article you are referencing or title o
>f the Web page that contains the information you are referencing. 
57          </li>
58          <li>URL for the Web site (paste the link into your docu
>ment) 
59          </li>
60          <li>Three facts from each Web site that answer the ques
>tions in the required information. 
61          </li>
62        </ul>
63      </li>
64    </ol>
65    <p>39    </p>
66      You <strong>must</strong> include this on every page which 40    <pre class="brush: html;">
>uses {{ domxref("navigator.id") }} functions. Because Persona is  
>still in development, you should not self-host the <code>include. 
>js</code> file. 
41&lt;script src="https://login.persona.org/include.js"&gt;&lt;/scr
 >ipt&gt;
42</pre>
67    </p>43    <p>
68    <h2 id="Step_2.3A_Add_login_and_logout_buttons">44      你<strong>必须</strong>在每个使用 {{ domxref("navigator.id") }} 中函数
 >的页面里包含这个标签。因为 Persona 始终在开发中,你不应该自行托管 <code>include.js</code> 文件。
69      Step 2: Add login and logout buttons
70    </h2>
71    <p>45    </p>
72      Because Persona is designed as a DOM API, you must call fun46    <h2 id=".E6.AD.A5.E9.AA.A42.EF.BC.9A.E6.B7.BB.E5.8A.A0.E7.99.
>ctions when a user clicks a login or logout button on your site. >BB.E5.85.A5.2F.E7.99.BB.E5.87.BA.E6.8C.89.E9.92.AE">
>To open the Persona dialog and prompt the user to log in, you sho 
>uld invoke {{ domxref("navigator.id.request()") }}. For logout, i 
>nvoke {{ domxref("navigator.id.logout()") }}. Note, the call to&n 
>bsp;{{ domxref("navigator.id.logout()", "logout()") }}&nbsp;<em>m 
>ust</em> be made in the click handler of the logout button. 
47      步骤2:添加登入/登出按钮
48    </h2>
73    </p>49    <p>
50      因 为 Persona 被设计为一个 DOM API,你必须在用户点击你站点上的登入或登出按钮时调用函数。要打开 Pe
 >rsona 对话框并提示用户登入,你应该调用 {{ domxref("navigator.id.request()") }} 。而
 >登出要调用 {{ domxref("navigator.id.logout()") }} 。
74    <p>51    </p>
75      For example:52    <p>
53      例如:
n81}n59};
n86}n64};
n88    <p>n
89      What should those buttons look like? Check out our <a href=
>"https://developer.mozilla.org/docs/persona/branding">Branding Re 
>sources</a> page for premade images and CSS-based buttons! 
90    </p>66    <p>
91    <h2 id="Step_3.3A_Watch_for_login_and_logout_actions">67      那些按钮的是什么样子的?查看我们的<a href="https://developer.mozilla.org/doc
 >s/persona/branding">品牌资源</a>页面中的预制图片和基于 CSS 的按钮!
92      Step 3: Watch for login and logout actions
93    </h2>
94    <p>68    </p>
95      For Persona to function, you need to tell it what to do whe69    <h2 id=".E6.AD.A5.E9.AA.A43.EF.BC.9A.E7.9B.91.E8.A7.86.E7.99.
>n a user logs in or out. This is done by calling the {{ domxref(">BB.E5.85.A5.2F.E7.99.BB.E5.87.BA.E8.A1.8C.E4.B8.BA">
>navigator.id.watch()") }} function and supplying three parameters 
>: 
70      步骤3:监视登入/登出行为
71    </h2>
72    <p>
73      要把 Persona 封装成函数,你需要告诉它当用户登入/登出时做什么。调用 {{ domxref("navigato
 >r.id.watch()") }} 函数就可以实现,它支持三个三处:
n100          The email address of the user currently logged into youn78          你站点当前用户的 <code>loggedInEmail</code> ,如果没有则为 <code>null<
>r site from this computer, or <code>null</code> if no one is logg>/code> 。你应该在渲染页面的时候动态生成它。
>ed in. For example, you might examine the browser's cookies to de 
>termine who is signed in. 
n105          A function to invoke when an <code>onlogin</code> action83          当触发 <code>onlogin</code> 行为的时候调用的函数。这个函数会被传递一个必须认证的“身份断
>n is triggered. This function is passed a single parameter, an “i>言”参数。
>dentity assertion,” which must be verified. 
n110          A function to invoke when an <code>onlogout</code> actin88          当触发 <code>onlogout</code> 行为的时候调用的函数。这个函数不会被传递任何参数。
>on is triggered. This function is not passed any parameters. 
n116        <strong>Note:</strong> You must always include both <coden94        <strong>注意:</strong>你必须总是在调用 {{ domxref("navigator.id.wat
>>onlogin</code> and <code>onlogout</code> when you call {{ domxre>ch()") }} 时同时包含 <code>onlogin</code> 和 <code>onlogout</code> 。
>f("navigator.id.watch()") }}. 
n120      For example, if you currently think Bob is logged into yourn98      例如,如果你现在认为鲍勃已经登入到你的站点,你会这样做:
> site, you might do this: 
n128    // A user has logged in! Here you need to:n106    // 一个用户已经登入!这是你需要做的:
129    // 1. Send the assertion to your backend for verification and107    // 1. 把断言发送到后端验证并创建一个会话。
> to create a session. 
130    // 2. Update your UI.108    // 2. 更新你的 UI。
131    $.ajax({ /* &lt;-- This example uses jQuery, but you can use 109    $.ajax({ /* &lt;-- 本例使用了 jQuery,但你也可以用你想用的 */
>whatever you'd like */ 
n133      url: '/auth/login', // This is a URL on your website.n111      url: '/auth/login', // 这是你网站上的一个 URL
n136      error: function(xhr, status, err) { alert("Login failure: "n114      error: function(res, status, xhr) { alert("登入失败" + res); }
> + err); } 
n140    // A user has logged out! Here you need to:n118    // 一个用户已经登出!这是你需要做的:
141    // Tear down the user's session by redirecting the user or ma119    // 销毁用户的会话并重定向用户或做后端的调用。
>king a call to your backend. 
142    // Also, make sure loggedInUser will get set to null on the n120    // 同样,让 loggedInUser 在下个页面加载时变为 null。
>ext page load. 
143    // (That's a literal JavaScript null. Not false, 0, or undefi121    // (这是一个字面的 JavaScript null。不是 false、 0 或 undefined。null。)
>ned. null.) 
n146      url: '/auth/logout', // This is a URL on your website.n124      url: '/auth/logout', // 这是你网站上的一个 URL
n148      error: function(xhr, status, err) { alert("Logout failure: n126      error: function(res, status, xhr) { alert("登出失败" + res); }
>" + err); } 
n154      In this example, both <code>onlogin</code> and <code>onlogon132      在本例中,<code>onlogin</code> 和 <code>onlogout</code> 都通过向你站点的后
>ut</code> are implemented by making an asynchronous <code>POST</c>端发送异步 <code>POST</code> 请求来实现。后端随后通常用设定或删除会话 cookie 中的信息来登入或登出用户。
>ode> request to your site’s backend. The backend then logs the us>之后,如果一切都核对无误,页面重加载来考虑账户的新登录状态。
>er in or out, usually by setting or deleting information in a ses 
>sion cookie. Then, if everything checks out, the page reloads to  
>take into account the new login state. 
155    </p>
156    <p>133    </p>
157      You can, of course, use AJAX to implement this without relo
>ading or redirecting, but that’s beyond the scope of this tutoria 
>l. 
158    </p>134    <p>
135      你当然可以用 AJAX 来不用重加载或重定向来实现,但这超出了本教程的范畴。
159    <p>136    </p>
160      Here is another example, this time not using jQuery.
161    </p>137    <p>
162    <pre class="brush: js;">138      你<strong>必须</strong>在每个有登入/登出按钮的页面上调用这个函数。要为用户支持 Persona 加强
 >功能,诸如自动登录和全局登出,你<strong>应该</strong>在网站上的每个页面都调用这个函数。
163function simpleXhrSentinel(xhr) {
164    return function() {
165        if (xhr.readyState == 4) {
166            if (xhr.status == 200)
167                // reload page to reflect new login state
168                window.location.reload();
169            else
170                alert("XMLHttpRequest error: " + xhr.status); } }
> } 
171 
172function verifyAssertion(assertion) {
173    // Your backend must return HTTP status code 200 to indicate 
>successful 
174    // verification of user's email address and it must arrange f
>or the binding 
175    // of currentUser to said address when the page is reloaded
176    var xhr = new XMLHttpRequest();
177    xhr.open("POST", "/xhr/sign-in", true);
178    // see http://www.openjs.com/articles/ajax_xmlhttp_using_post
>.php 
179    var param = "assert="+assertion;
180    xhr.setRequestHeader("Content-type", "application/x-www-form-
>urlencoded"); 
181    xhr.setRequestHeader("Content-length", param.length);
182    xhr.setRequestHeader("Connection", "close");
183    xhr.send(param); // for verification by your backend
184 
185    xhr.onreadystatechange = simpleXhrSentinel(xhr); }
186 
187function signoutUser() {
188    // Your backend must return HTTP status code 200 to indicate 
>successful 
189    // sign out (usually the resetting of one or more session var
>iables) and 
190    // it must arrange for the binding of currentUser to 'null' w
>hen the page 
191    // is reloaded
192    var xhr = new XMLHttpRequest();
193    xhr.open("GET", "/xhr/sign-out", true);
194    xhr.send(null);
195    xhr.onreadystatechange = simpleXhrSentinel(xhr); }
196 
197// Go!
198navigator.id.watch( {
199    loggedInUser: currentUser,
200         onlogin: verifyAssertion,
201        onlogout: signoutUser } );
202</pre>
203    <p>139    </p>
204      You <strong>must</strong> call <code>navigator.id.watch()</140    <h2 id=".E6.AD.A5.E9.AA.A44.EF.BC.9A.E9.AA.8C.E8.AF.81.E7.94.
>code> on every page with a login or logout button. To support Per>A8.E6.88.B7.E8.AF.81.E4.B9.A6">
>sona enhancements like automatic login and global logout for your 
> users, you <strong>should</strong> call this function on every p 
>age of your site. 
141      步骤4:验证用户证书
142    </h2>
205    </p>143    <p>
144      Persona 用“身份断言”来代替密码,那是一种类似一次性、单站点的、用户邮件地址捆绑的密码。当用户想要登入时,你的
 > <code>onlogin</code> 回调会传入一个该用户的断言来调用。在你登入他们前,你必须验证断言的有效性。
206    <p>145    </p>
207      Persona will compare the email address you've passed into <
>code>loggedInUser</code> with its own knowledge of whether a user 
> is currently logged in, and who they are. If these don't match,  
>it may automatically invoke <code>onlogin</code> or <code>onlogou 
>t</code> on page load. 
208    </p>146    <p>
147      在你的服务器上而不是用户浏览器上运行的 JavaScript 中验证断言是<em>极度</em>重要的,因为那很容易伪
 >造。上面的例子用 jQuery 的 <code>$.ajax()</code> 辅助函数来把断言通过 <code>POST</co
 >de> 到 <code>/auth/login</code> 来呈递给后端。
209    <p>148    </p>
210      &nbsp;
211    </p>149    <p>
212    <h2 id="Step_4.3A_Verify_the_user.E2.80.99s_credentials">150      一旦你的服务器获得了断言,你如何验证它?最简单的方法是用 Mozilla 提供的辅助服务。简单地把断言以两个参数 <c
 >ode>POST</code> 给 <code>https://verifier.login.persona.org/verify
 ></code>:
213      Step 4: Verify the user’s credentials
214    </h2>
215    <p>
216      Instead of passwords, Persona uses “identity assertions,” w
>hich are kind of like single-use, single-site passwords combined  
>with the user’s email address. When a user wants to log in, your  
><code>onlogin</code> callback will be invoked with an assertion f 
>rom that user. Before you can log them in, you must verify that t 
>he assertion is valid. 
217    </p>
218    <p>
219      It’s <em>extremely important</em> that you verify the asser
>tion on your server, and not in JavaScript running on the user’s  
>browser, since that would be easy to forge. The example above han 
>ded off the assertion to the site’s backend by using jQuery’s <co 
>de>$.ajax()</code> helper to <code>POST</code> it to <code>/auth/ 
>login</code>. 
220    </p>
221    <p>
222      Once your server has an assertion, how do you verify it? Th
>e easiest way is to use a helper service provided by Mozilla. Sim 
>ply <code>POST</code> the assertion to <code>https://verifier.log 
>in.persona.org/verify</code> with two parameters: 
n226        <code>assertion</code>: The identity assertion provided bn154        <code>assertion</code>: 用户提供的身份断言。
>y the user. 
227      </li>
228      <li>155      </li>
229        <code>audience</code>: The hostname and port of your webs156      <li>
>ite. You must hardcode this value in your backend; do not derive  
>it from any data supplied by the user. 
157        <code>audience</code>: 你网站的主机名和端口。你必须在后端硬编码这个值;不要从用户提供的任何
 >数据中派生这个值。
n233      For example, if you’re <code>example.com</code>, you can usn161      例如,如果你是 <code>example.com</code>,你可以用下面的命令行来测试断言:
>e the command line to test an assertion with: 
n239      If it’s valid, you’ll get a JSON response like this:n167      如果它是有效的,你会得到像这样的一个 JSON 响应:
n251      You can learn more about the verification service by readinn179      你可以阅读<a href="https://developer.mozilla.org/en-US/docs/Brow
>g <a href="https://developer.mozilla.org/en-US/docs/BrowserID/Rem>serID/Remote_Verification_API">验证服务 API</a>来获知更多关于验证服务的内容。一个 <cod
>ote_Verification_API">The Verification Service API</a>. An exampl>e>/api/login</code> 实现的使用了 <a href="http://python.org/">Python</a
>e <code>/api/login</code> implementation, using <a href="http://p>>、<a href="http://flask.pocoo.org/">Flask</a> web 框架和 <a href="ht
>ython.org/">Python</a>, the <a href="http://flask.pocoo.org/">Fla>tp://python-requests.org">Requests</a> HTTP 库的例子看起来是这样:
>sk</a> web framework, and the <a href="http://python-requests.org 
>">Requests</a> HTTP library might look like this: 
n256    # The request has to have an assertion for us to verifyn184    # 请求必须包含我们要验证的断言
n260    # Send the assertion to Mozilla's verifier service.n188    # 把断言发送给 Mozilla 的验证服务
n264    # Did the verifier respond?n192    # 验证器响应了吗?
n266        # Parse the responsen194        # 处理响应
n269        # Check if the assertion was validn197        # 检查断言是否有效
n271            # Log the user in by setting a secure session cookien199            # 设置一个安全会话 cookie 来登入用户
n275    # Oops, something failed. Abort.n203    # 哎哟,有什么东西不对,放弃
t279      For an example on how to use Persona in a C# ASP.Net MVC3 at207      会话管理可能很像你现有的登录系统。首先的大区别是在验证用户身份采用了检查断言而不是检查密码。另一个不同是确保用户的邮件
>pplication, <a href="https://github.com/sergiotapia/ASP.Net-MVC3->地址有效来用于 {{ domxref("navigator.id.watch()") }} 的 <code>loggedInEma
>Persona-Demo" title="https://github.com/sergiotapia/ASP.Net-MVC3->il</code> 参数
>Persona-Demo">visit this application demo</a>&nbsp;or see the Con 
>troller code below: 
280    </p>
281    <p>208    </p>
282      &nbsp;
283    </p>209    <p>
284    <pre class="brush:java;">210      登出很简单:你只需要移除用户的会话 cookie。
285public class AuthController : Controller
286{
287    [HttpPost]
288    public ActionResult Login(string assertion)
289    {
290        if (assertion == null)
291        {
292            // The 'assertion' key of the API wasn't POSTED. Redi
>rect, 
293            // or whatever you'd like, to try again.
294            return RedirectToAction("Index", "Home");
295        }
296 
297        using (var web = new WebClient())
298        {
299            // Build the data we're going to POST.
300            var data = new NameValueCollection();
301            data["assertion"] = assertion;
302            data["audience"] = "https://example.com:443"; // Use 
>your website's URL here. 
303 
304 
305            // POST the data to the Persona provider (in this cas
>e Mozilla) 
306            var response = web.UploadValues("https://verifier.log
>in.persona.org/verify", "POST", data); 
307            var buffer = Encoding.Convert(Encoding.GetEncoding("i
>so-8859-1"), Encoding.UTF8, response); 
308 
309 
310            // Convert the response to JSON.
311            var tempString = Encoding.UTF8.GetString(buffer, 0, r
>esponse.Length); 
312            var reader = new JsonReader();
313            dynamic output = reader.Read(tempString);
314 
315            if (output.status == "okay")
316            {
317                string email = output.email; // Since this is dyn
>amic, convert it to string. 
318                FormsAuthentication.SetAuthCookie(email, true);
319                return RedirectToAction("Index", "Home");
320            }
321 
322            // Could not log in, do something else.
323            return RedirectToAction("Index", "Home");
324        }
325    }
326}
327</pre>
328    <p>211    </p>
329      The session management is probably very similar to your exi212    <h2 id=".E6.AD.A5.E9.AA.A45.EF.BC.9A.E5.9B.9E.E9.A1.BE.E6.9C.
>sting login system. The first big change is in verifying the user>80.E4.BD.B3.E5.AE.9E.E8.B7.B5">
>’s identity by checking an assertion instead of checking a passwo 
>rd. The other big change is ensuring that the user’s email addres 
>s is available for use as the <code>loggedInEmail</code> paramete 
>r to {{ domxref("navigator.id.watch()") }}. 
213      步骤5:回顾最佳实践
214    </h2>
330    </p>215    <p>
216      一旦所有的东西都工作正常并且你已经成功登入和登出你的站点,你应该花一会时间来回顾安全可靠地使用 Persona 的<a
 > href="https://developer.mozilla.org/docs/BrowserID/Security_Cons
 >iderations">最佳实践</a>。
331    <p>217    </p>
332      Logout is simple: you just need to remove the user’s sessio
>n cookie. 
333    </p>218    <p>
334    <h2 id="Step_5.3A_Review_best_practices">219      如果你在做一个要作为生产环境的站点,你会想要编写集成的测试来模拟用 Persona 登入或登出用户。要改善 Selen
 >ium 中的这个行为,请考虑使用 <a href="https://github.com/mozilla/bidpom" titl
 >e="https://github.com/mozilla/bidpom">bidpom</a> 库。<a href="https
 >://mockmyid.com/" title="https://mockmyid.com/">mockmyid.com</a> 
 >和 <a href="http://personatestuser.org" title="http://personatestu
 >ser.org">personatestuser.org</a> 这两个网站也可能会有用。
335      Step 5: Review best practices
336    </h2>
337    <p>220    </p>
338      Once everything works and you’ve successfully logged into a
>nd out of your site, you should take a moment to review <a href=" 
>https://developer.mozilla.org/docs/BrowserID/Security_Considerati 
>ons">best practices</a> for using Persona safely and securely. 
339    </p>221    <p>
340    <p>222      最后,不要忘记登记加入 <a href="https://mail.mozilla.org/listinfo/pers
 >ona-notices">Persona 通知</a> 邮件列表,这样会通知你任何安全问题或 Persona API 的向后兼容变
 >更。这个列表的流量非常低:它只用于通知会对你的站点造成负面影响的变更。
341      If you're making a production-ready site, you may want to w
>rite integration tests that simulate logging a user in and out of 
> your site using Persona. To facilitate this action in Selenium,  
>consider using the <a href="https://github.com/mozilla/bidpom" ti 
>tle="https://github.com/mozilla/bidpom">bidpom</a> library. The s 
>ites <a href="https://mockmyid.com/" title="https://mockmyid.com/ 
>">mockmyid.com</a> and <a href="http://personatestuser.org" title 
>="http://personatestuser.org">personatestuser.org</a> may also be 
> helpful. 
342    </p>
343    <p>
344      Lastly, don’t forget to sign up for the <a href="https://ma
>il.mozilla.org/listinfo/persona-notices">Persona notices</a> mail 
>ing list so you’re notified of any security issues or backwards i 
>ncompatible changes to the Persona API. The list is extremely low 
> traffic: it’s only used to announce changes which may adversely  
>impact your site. 
345    </p>
346    <p>
347      &nbsp;

回到編輯歷史