【问题标题】:How to store token in Local or Session Storage in Angular 2?如何将令牌存储在 Angular 2 的本地或会话存储中?
【发布时间】:2017-02-11 22:05:39
【问题描述】:

我想使用本地或会话存储将身份验证令牌保存在 angular 2.0.0. 我使用 angular2-localstorage 但它仅适用于 angular 2.0.0- rc.5 并且当我在 2.0.0 中使用它时,它通过我的 Type 错误。我想使用 Angular 2.0.0 的默认本地存储。

【问题讨论】:

标签: angular local-storage


【解决方案1】:

简单示例:

var userID = data.id;

localStorage.setItem('userID',JSON.stringify(userID));

【讨论】:

    【解决方案2】:

    作为一般规则,令牌不应存储在localStoragesessionStorage 上。这两个地方都可以从 JS 访问,并且 JS 不应该关心身份验证令牌。

    恕我直言,令牌应存储在带有 HttpOnlySecure 标志的 cookie 中,如下所示:https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage

    【讨论】:

    • 我同意你的观点,本地存储不够安全。
    【解决方案3】:
    var arr=[{"username":"sai","email":"sai@example.com,"}]
    localStorage.setItem('logInArr', JSON.stringfy(arr))
    

    【讨论】:

    • 感谢您添加对此问题的答案。您能否edit 添加一些解释为什么您的答案是一个好的答案并帮助学习者理解它。这将帮助您获得声誉投票。
    【解决方案4】:

    我们可以像这样存储会话存储

    存储令牌应该像

     localStorage.setItem('user', JSON.stringify({ token: token, username: username }));
    

    将 Session 存储到 sessionStorage

    您可以将字符串和数组存储到会话存储中

    字符串示例

        let key = 'title'; 
        let value = 'session';
        sessionStorage.setItem(key, value);
    

    数组示例

        let key = 'user'; 
        let value = [{'name':'shail','email':'example@gmail.com'}];
    
        value = JSON.stringify(value);
    
        sessionStorage.setItem(key, value);
    

    按键从 sessionStorage 中获取存储的会话

    const session = sessionStorage.getItem('key');
    

    按键从 sessionStorage 中删除保存的会话

    sessionStorage.removeItem('key');
    

    从 sessionStorage 中删除所有已保存的会话

    sessionStorage.clear();
    
    1. store 本地存储应该是这样的

    将项目存储到本地存储中

    您可以将字符串和数组存储到位置存储中

    字符串示例

     let key = 'title'; 
     let value = 'session';
     localStorage.setItem(key, value);
    

    数组示例

    let key = 'user'; 
    let value = [{'name':'shail','email':'example@gmail.com'}];
    
    value = JSON.stringify(value);
    
    localStorage.setItem(key, value);
    

    按键从localStorage中获取存储的项目

    const item = localStorage.getItem('key');
    

    按键从 localStorage 中删除已保存的会话

    localStorage.removeItem('key');

    从 localStorage 中删除所有保存的项目

    localStorage.clear();
    

    【讨论】:

    • 两种方式都可以通过this.sessionStorage.getItem('token')获取token,通过this.sessionStorage.removeItem('token')移除token。
    【解决方案5】:

    import { Injectable,OpaqueToken } from '@angular/core'; export const localStorage = new OpaqueToken('localStorage');

    将这些行放在文件的顶部,它应该可以解决问题。

    【讨论】:

      【解决方案6】:

      添加到 Bojan Kogoj 的答案:

      在您的 app.module.ts 中,添加一个新的存储提供程序。

      @NgModule({
         providers: [
            { provide: Storage, useValue: localStorage }
         ],
         imports:[],
         declarations:[]
      })
      

      然后,您可以使用 DI 在任何需要的地方获取它。

       @Injectable({
          providedIn:'root'
       })
       export class StateService {
          constructor(private storage: Storage) { }
       }
      

      【讨论】:

        【解决方案7】:

        这是最佳做法:https://github.com/PillowPillow/ng2-webstorage

        我在 AngularJs 中使用它,现在使用 Angular2。很有用。

        【讨论】:

          【解决方案8】:

          这完全取决于您到底需要什么。 如果您只需要存储和检索令牌以便在您的 http 请求中使用它, 我建议你简单地创建一个服务并在你的整个项目中使用它。

          基本集成示例:

          import {Injectable} from 'angular@core'
          
          @Injectable()
          export class TokenManager {
          
              private tokenKey:string = 'app_token';
          
              private store(content:Object) {
                  localStorage.setItem(this.tokenKey, JSON.stringify(content));
              }
          
              private retrieve() {
                  let storedToken:string = localStorage.getItem(this.tokenKey);
                  if(!storedToken) throw 'no token found';
                  return storedToken;
              }
          
              public generateNewToken() {
                  let token:string = '...';//custom token generation;
                  let currentTime:number = (new Date()).getTime() + ttl;
                  this.store({ttl: currentTime, token});
              }
          
              public retrieveToken() {
          
                  let currentTime:number = (new Date()).getTime(), token = null;
                  try {
                      let storedToken = JSON.parse(this.retrieve());
                      if(storedToken.ttl < currentTime) throw 'invalid token found';
                      token = storedToken.token;
                  }
                  catch(err) {
                      console.error(err);
                  }
                  return token;
          
              }
          
          }
          

          但是,如果您需要更频繁地使用本地存储,例如使用应用视图中存储的值。 您可以像使用 angular2-localstorage 一样使用提供 webstorage 包装器的库之一。

          几个月前我创建了ng2-webstorage,它应该可以满足您的需求。 它提供了两个 ng2 服务和两个装饰器来同步 webstorage 的值和服务/组件的属性。

          import {Component} from '@angular/core';
          import {LocalStorageService, LocalStorage} from 'ng2-webstorage';
          
          @Component({
              selector: 'foo',
              template: `
                  <section>{{boundValue}}</section>
                  <section><input type="text" [(ngModel)]="attribute"/></section>
                  <section><button (click)="saveValue()">Save</button></section>
              `,
          })
          export class FooComponent {
          
              @LocalStorage()
              boundValue; // attribute bound to the localStorage
              value;
          
              constructor(private storage:LocalStorageService) {
                  this.localSt.observe('boundValue')// triggers the callback each time a new value is set
                      .subscribe((newValue) => console.log('new value', newValue));
              }
          
              saveValue() {
                this.storage.store('boundValue', this.value); // store the given value
              }
          
          }
          

          【讨论】:

            【解决方案9】:

            保存到本地存储

            localStorage.setItem('currentUser', JSON.stringify({ token: token, name: name }));
            

            从本地存储加载

            var currentUser = JSON.parse(localStorage.getItem('currentUser'));
            var token = currentUser.token; // your token
            

            更多我建议你阅读本教程:Angular 2 JWT Authentication Example & Tutorial

            【讨论】:

            • 如果我输入 JSON.parse(localStorage.getItem('currentUser')).token 我可以在控制台中看到令牌。如何在生产中避免这种情况?
            • @Zaker 不要将您的令牌存储在本地存储中。
            • @Archibald 你能建议我在哪里存储令牌。任何链接描述也将有所帮助。谢谢
            • 为此使用 cookie,带有 HttpOnlySecure 标志:stormpath.com/blog/…
            • @Zaker 如果浏览器曾经拥有令牌,那么它对用户来说永远不会安全。您唯一能做的就是永远不要向浏览器发送您不希望用户看到的任何内容。这与防止 XSS 不同。
            猜你喜欢
            • 1970-01-01
            • 2019-06-12
            • 2019-03-24
            • 2019-10-26
            • 1970-01-01
            • 2021-10-08
            • 2022-01-15
            • 2018-05-06
            • 1970-01-01
            相关资源
            最近更新 更多