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)?

Miquel
fuente
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();
        }
    }
}
Miquel
fuente
5
Hágalo
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
Jerusalén
fuente
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');
Arturs Soms
fuente
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!

Deepak Swain
fuente
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();
        }
    }

}
Milán
fuente
¿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

WasiF
fuente
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 "";
Pelice
fuente