Cookies angulares


81

He estado buscando cookies angulares por todas partes, pero no he podido encontrar cómo implementar la administración de cookies en Angular. ¿Hay alguna forma de administrar las cookies (como $ cookie en AngularJS)?


7
Angular2 no tiene ninguna biblioteca / servicio nativo para manejar cookies. La forma preferida es utilizar JWT / LocalStorage. github.com/auth0/angular2-authentication-sample
stan

Respuestas:


76

Terminé creando mis propias funciones:

@Component({
    selector: 'cookie-consent',
    template: cookieconsent_html,
    styles: [cookieconsent_css]
})
export class CookieConsent {
    private isConsented: boolean = false;

    constructor() {
        this.isConsented = this.getCookie(COOKIE_CONSENT) === '1';
    }

    private getCookie(name: string) {
        let ca: Array<string> = document.cookie.split(';');
        let caLen: number = ca.length;
        let cookieName = `${name}=`;
        let c: string;

        for (let i: number = 0; i < caLen; i += 1) {
            c = ca[i].replace(/^\s+/g, '');
            if (c.indexOf(cookieName) == 0) {
                return c.substring(cookieName.length, c.length);
            }
        }
        return '';
    }

    private deleteCookie(name) {
        this.setCookie(name, '', -1);
    }

    private setCookie(name: string, value: string, expireDays: number, path: string = '') {
        let d:Date = new Date();
        d.setTime(d.getTime() + expireDays * 24 * 60 * 60 * 1000);
        let expires:string = `expires=${d.toUTCString()}`;
        let cpath:string = path ? `; path=${path}` : '';
        document.cookie = `${name}=${value}; ${expires}${cpath}`;
    }

    private consent(isConsent: boolean, e: any) {
        if (!isConsent) {
            return this.isConsented;
        } else if (isConsent) {
            this.setCookie(COOKIE_CONSENT, '1', COOKIE_CONSENT_EXPIRE_DAYS);
            this.isConsented = true;
            e.preventDefault();
        }
    }
}

5

17
Tal vez podría publicar su propia solución con funcionalidad inyectable, que sería genial para otros que la necesitan inyectable :)
Miquel

¿Tiene que ser un componente? ¿Por qué no lo convierte en un servicio inyectable?
Ben Bozorg

Podría ser, pero esto también tiene html y css para mostrar el banner de consentimiento. Parece más un componente que un servicio. También podrías hacer un servicio, pero debería ser uno más abstracto :)
Miquel

6
He creado el servicio inyectable basado en la respuesta anterior: gist.github.com/greatb/c791796c0eba0916e34c536ab65802f8
Bala

43

Actualización: la cookie angular2 ahora está en desuso. En su lugar, utilice mi cookie ngx .

Respuesta anterior:

Aquí está angular2-cookie, que es la implementación exacta del $cookiesservicio Angular 1 (más un removeAll()método) que creé. Utiliza los mismos métodos, solo implementados en mecanografiado con lógica Angular 2.

Puede inyectarlo como servicio en la providersmatriz de componentes :

import {CookieService} from 'angular2-cookie/core';

@Component({
    selector: 'my-very-cool-app',
    template: '<h1>My Angular2 App with Cookies</h1>',
    providers: [CookieService]
})

Después de eso, defínalo en la consturctur como de costumbre y comience a usar:

export class AppComponent { 
  constructor(private _cookieService:CookieService){}

  getCookie(key: string){
    return this._cookieService.get(key);
  }
}

Puede obtenerlo a través de npm:

npm install angular2-cookie --save

1
¿Cuál es la diferencia con ng2-cookies?
Miquel

Está utilizando la lógica angular 1 y los métodos detrás de escena. Entonces es de una manera más angular. También tiene todos los métodos del servicio $ cookies, además de un método para eliminar todo. También proporciona opciones globales y de parámetros. Y es un servicio.
Jerusalén

ngx-cookie tampoco parece estar actualizado.
Jeppe

Finalmente se actualizó. El desarrollador estaba ocupado con otras cosas y también es un poco vago: D
Jerusalén

11

Sí, aquí hay una ng2-cookies

Uso:

import { Cookie } from 'ng2-cookies/ng2-cookies';

Cookie.setCookie('cookieName', 'cookieValue');
Cookie.setCookie('cookieName', 'cookieValue', 10 /*days from now*/);
Cookie.setCookie('cookieName', 'cookieValue', 10, '/myapp/', 'mydomain.com');

let myCookie = Cookie.getCookie('cookieName');

Cookie.deleteCookie('cookieName');

1
Su API ha cambiado aquí están los documentos: github.com/BCJTI/ng2-cookies/wiki/Minimum-running-example
etayluz

8

Utilice el servicio de cookies de NGX

Inastall este paquete: npm install ngx-cookie-service --save

Agregue el servicio de cookies a su app.module.ts como proveedor:

import { CookieService } from 'ngx-cookie-service';
@NgModule({
  declarations: [ AppComponent ],
  imports: [ BrowserModule, ... ],
  providers: [ CookieService ],
  bootstrap: [ AppComponent ]
})

Luego llame a su componente:

import { CookieService } from 'ngx-cookie-service';

constructor( private cookieService: CookieService ) { }

ngOnInit(): void {
  this.cookieService.set( 'name', 'Test Cookie' ); // To Set Cookie
  this.cookieValue = this.cookieService.get('name'); // To Get Cookie
}

¡Eso es!


Hola Deepak, ¿has trabajado con este servicio hasta ahora? Porque tengo una pregunta y espero que puedas ayudarme.
Mr. Jo

He instalado tanto el servicio ngx como el consentimiento de cookies. Ahora estoy luchando mucho para implementarlo de forma voluntaria. Intenté eliminar todas las cookies si el usuario presiona el botón de rechazar cookies, pero se están restableciendo de alguna manera. Entonces, ¿sabe cómo se debe hacer esto de la manera correcta?
Mr. Jo

Esta es mi pregunta sobre esto: stackoverflow.com/questions/61656421/…
Sr. Jo

Parece que la versión 10.1.1crea un error Uncaught TypeError: Object(...) is not a function. Utilizo la versión 2.1.0para que el código funcione. Consulta github.com/stevermeister/ngx-cookie-service/issues/103
Manu Chadha

5

Hago la versión Miquels Injectable como servicio:

import { Injectable } from '@angular/core';

@Injectable()
export class CookiesService {

    isConsented = false;

    constructor() {}

    /**
     * delete cookie
     * @param name
     */
    public deleteCookie(name) {
        this.setCookie(name, '', -1);
    }

    /**
     * get cookie
     * @param {string} name
     * @returns {string}
     */
    public getCookie(name: string) {
        const ca: Array<string> = decodeURIComponent(document.cookie).split(';');
        const caLen: number = ca.length;
        const cookieName = `${name}=`;
        let c: string;

        for (let i  = 0; i < caLen; i += 1) {
            c = ca[i].replace(/^\s+/g, '');
            if (c.indexOf(cookieName) === 0) {
                return c.substring(cookieName.length, c.length);
            }
        }
        return '';
    }

    /**
     * set cookie
     * @param {string} name
     * @param {string} value
     * @param {number} expireDays
     * @param {string} path
     */
    public setCookie(name: string, value: string, expireDays: number, path: string = '') {
        const d: Date = new Date();
        d.setTime(d.getTime() + expireDays * 24 * 60 * 60 * 1000);
        const expires = `expires=${d.toUTCString()}`;
        const cpath = path ? `; path=${path}` : '';
        document.cookie = `${name}=${value}; ${expires}${cpath}; SameSite=Lax`;
    }

    /**
     * consent
     * @param {boolean} isConsent
     * @param e
     * @param {string} COOKIE
     * @param {string} EXPIRE_DAYS
     * @returns {boolean}
     */
    public consent(isConsent: boolean, e: any, COOKIE: string, EXPIRE_DAYS: number) {
        if (!isConsent) {
            return this.isConsented;
        } else if (isConsent) {
            this.setCookie(COOKIE, '1', EXPIRE_DAYS);
            this.isConsented = true;
            e.preventDefault();
        }
    }

}

¿Cómo configurar HttpOnly y banderas seguras?
iniravpatel

2

También es beneficioso almacenar datos en sessionStorage

// Save data to sessionStorage
sessionStorage.setItem('key', 'value');

// Get saved data from sessionStorage
var data = sessionStorage.getItem('key');

// Remove saved data from sessionStorage
sessionStorage.removeItem('key');

// Remove all saved data from sessionStorage
sessionStorage.clear();

para más detalles https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage


0

Para leer una cookie, hice pequeñas modificaciones a la versión de Miquel que no me funcionan:

getCookie(name: string) {
        let ca: Array<string> = document.cookie.split(';');
        let cookieName = name + "=";
        let c: string;

        for (let i: number = 0; i < ca.length; i += 1) {
            if (ca[i].indexOf(name, 0) > -1) {
                c = ca[i].substring(cookieName.length +1, ca[i].length);
                console.log("valore cookie: " + c);
                return c;
            }
        }
        return "";
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.