Page 209 - AngularJS权威教程
P. 209

18.11 用户认证/鉴权   189


                                  attrs.$set('data-cookiepolicy', 'single_host_origin');             1
                                  attrs.$set('data-requestvisibleactions',
                                      'http://schemas.google.com/AddActivity')
                                  attrs.$set('data-scope', scopeUrls.join(' '));
                                                                                                     2
                                  // 最后,刷新客户端库
                                  // 强迫按钮在浏览器中重绘
                                  (function() {                                                      3
                                      var po = document.createElement('script');
                                     po.type = 'text/javascript';
                                      po.async = true;
                                      po.src = 'https://apis.google.com/js/client:plusone.js';       4
                                      var s = document.getElementsByTagName('script')[0];
                                      s.parentNode.insertBefore(po, s);
                                  })();                                                              5
                              }
                          }
                  });
                                                                                                     6
                  尽管这个指令很长,但它还是相当简单的。我们是在给Google按钮赋值一个g-signin样式类,
              添加基于传入属性的Client ID,建立作用域,等等。
                                                                                                     7
                  这个指令的一个特有部分是我们在窗口自定义回调函数。既然Google的库要求我们有一个回
              调函数,以便在登录之后作提醒用,我们需要在指令中模拟这个回调。使用window[callbackId]
                                                                                                     8
              能让我们在调用这个函数时,模拟这个需要在JavaScript中调用的回调方法,能让我们真正调用到
              本地的afterSignin动作。
                                                                                                     9
                  然后,我们将全局对象清理掉,因为在AngularJS中是比较忌讳全局状态的。
                  指令准备好了之后,就可以在视图中包含这个指令了。我们将在视图中调用指令,把指令上                                           10
              的client-id和after-signin属性替换成我们自己的,如下所示:

                      确认包含了oauth参数,正如在after-signup属性中写的那样。我们必须用这种方                                   11
                  式调用这个参数,这是由Angular在指令中调用带参数方法的机制决定的。

                  <h2>Signin to ngroad</h2>                                                          12
                  <div google-signin
                    client-id='CLIENT_ID'
                    after-signin="signedIn(oauth)"></div>                                            13
                  <pre>{{ user | json }}</pre>
                      本示例中的用户数据就是登录返回的access_token(如果登录了的话)。它不是存
                  在我们的服务器上的,也不是敏感数据,而且会在我们离开页面时消失。                                                   14

                  最后,我们需要让按钮实实在在地引发一个操作,所以要在控制器中定义after-signin的                                      15
              方法signedIn(oauth)。
                  这个signedIn()在真实的应用中为我们消除已认证的页面。
                                                                                                     16

                          这个方法会是重定向到一个新路由的理想位置(例如,把已认证的用户导向
                         /dashboard路由)。                                                              17

                  angular.module('myApp')
                      .controller('MainController',                                                  18
                      function($scope) {
   204   205   206   207   208   209   210   211   212   213   214