AngularJS1 + Django REST Frameworkに再挑戦 その6 ngCookies for JWT Token
概要
AngularJS1 + Django REST Frameworkに再挑戦 その6 ngCookies for JWT Token
参考動画
Django + AngularJS | Coding For Entrepreneurs
ngCookies for JWT Token
前回の続きで、今回は、JWT によって発行されたtokenを使って、angularJSからのログインを実装する。
その為には、ngCookiesというライブラリ?を利用する。
公式サイト:
https://docs.angularjs.org/api/ngCookies
- これを利用するには、home.htmlで、読み込む必要あり!
<script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular-cookies.js'></script>
- さらにapp.module.jsにいつものように追記する。
'ngCookies',
- login-detai.component.jsに追記する。
...
controller: function(
$cookies,
...
- いよいよtokenをcookieのputメソッドを利用して、入力してみる。
requestAction.success(function(r_data, r_status, r_headers, r_config){ console.log(r_data) //tokenをゲットできる。 $cookies.put("token", r_data.token) // r_data.tokenを"token"としてcookieに送付できる。 })
さらに、
var tokenExists = $cookies.get("token")
で、入力したtokenをtokenExistsに代入する。tokenExistsがある場合だけ、loginができるような下準備をする。
var tokenExists = $cookies.get("token") if (tokenExists) { // verify token $scope.loggedIn = true; }
- cookiesにusernameも渡すようにしておく。あとあと使うのかな?
requestAction.success(function(r_data, r_status, r_headers, r_config){ // console.log(r_data) //tokenをゲットできる。 $cookies.put("token", r_data.token) // r_data.tokenを"token"としてcookieに送付できる。 $cookies.put("username", user.username) // usernameもcookiesに入れておく。なぜだ? })
これでログインしてみる。。。特に何も起きない。。。なぜだ。
cookieにはちゃんと渡せているか、blog-list.component.jsを使って実験してみる。
controller: function(Post, $cookies, $location, $routeParams, $rootScope, $scope){ // console.log($location.search()) console.log($cookies.get("username")) console.log($cookies.get("token"))
OK!ちゃんと表示されている!
navbarにログインボタンを表示させたいので、try-nav.htmlに追記する。
<li><a ng-href="/login" ng-hide='userLoggedIn'>Login</a></li>
- さらに、try-nav.directive.jsにuserLoggedInの条件分岐を追記する。
scope.userLoggedIn = false var token = $cookies.get("token") console.log(token) if (token) { scope.userLoggedIn = true }
これで、tokenがあるときは、userLoggedInがtrueになり、結果的に、loginしているときは、loginボタンが表示されないようになる。
tokenは、最低限の仕事を終えたら、cookieから削除するため、以下の通り、tokenを削除するコードをlogin-detail.component.javascriptに追記する。usernameは、cokkiesからゲットして、scope.userの辞書に加えておく。
var tokenExists = $cookies.get("token") if (tokenExists) { // verify token $scope.loggedIn = true; $cookies.remove("token") $scope.user = { username: $cookies.get("username") } }
- ログインに成功したとき用のlocationも追記しておく。
requestAction.success(function(r_data, r_status, r_headers, r_config){ ... $location.path("/") ... })
おー、ログインに成功したらトップ画面が表示されるようになった〜!
ただ現状では、loginボタンがうまく消えない。ので、try-nav.directive.jsを修正する。$watchを使う。$watchは、対象の関数、変数などが変化したときに監視して、処理してくれる便利なメソドぽい。
scope.userLoggedIn = false scope.$watch(function(){ var token = $cookies.get("token") // console.log(token) if (token) { scope.userLoggedIn = true } else { scope.userLoggedIn = false } })
オーー、ログインしたら消えた〜!
ログアウトボタンも
<li><a ng-href="/logout" ng-show='userLoggedIn'>Logout</a></li>
で作成してみる。loginの時と逆で、userLoggedInが、trueの時に現れる。loginの時にtokenが削除されているので、logoutをクリックすると、userloggedinが、falseになる。さらに、app.config.jsにroutingを追記する。logoutにアクセスしたときは、自動で、loginにredirectするように設定する。
when("/logout", { // template: "<login-detail></login-detail>" redirectTo: '/login' }).