gpt4 book ai didi

angular - angular 2 universal,nodejs中的身份验证

转载 作者:太空狗 更新时间:2023-10-29 17:05:40 25 4
gpt4 key购买 nike

我下载了 nodejs 的 universal-starter 并开始从旧的 angular-rc4 迁移我的网站。但是当我必须实现身份验证时(在我的例子中是存储在 localStorage 中的 JWT),服务器没有 localStorage 和 cookie,因此 Angular 仅在客户端呈现。

我遵循了这个指南:https://github.com/angular/universal-starter/issues/148但它没有用。

下面是我的代码:

authentication.services.ts

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

export let AUTH_SERVICES = new OpaqueToken('auth.services');

export interface AuthenticationService {

forgotPassword(email: any);

isAuthenticated();

getCurrentUser();

refreshToken();

signin(user : any);

signout();

signup(user : any);

}

服务器.authentication.ts

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

import { AuthenticationService } from './authentication.services';

@Injectable()
export class ServerAuthenticationService implements AuthenticationService {
forgotPassword(email: any) {
throw new Error('Forgot password cannot be called while doing server side rendering');
}

isAuthenticated() {
return false;
}

getCurrentUser(){
if(this.isAuthenticated()) {
return {};
}
return {};
}

refreshToken() {

}

signin(user : any) {
throw new Error('Login cannot be called while doing server side rendering');
}

signout() {
throw new Error('Logout cannot be called while doing server side rendering');
}

signup(user : any) {
throw new Error('Sign up cannot be called while doing server side rendering');
}
}

clientAuthentication.services.ts

@Injectable()
export class UserService implements AuthenticationService {
forgotPassword(email: any){
// client implementation
}

isAuthenticated() {
// client implementation
}

getCurrentUser() {
// client implementation
}

refreshToken() {
// client implementation
}

signin(user : any){
// client implementation
}

signout(){
// client implementation
}

signup(user : any) {
// client implementation
}
}

app.browser.module.ts

@NgModule({
bootstrap: [ AppComponent ],
declarations: [ AppComponent ],
imports: [
UniversalModule, // BrowserModule, HttpModule, and JsonpModule are included
FormsModule,

SharedModule,
HomeModule,
AboutModule,

NavbarModule,

AppRoutingModule
],
providers: [
{ provide: 'isBrowser', useValue: isBrowser },
{ provide: 'isNode', useValue: isNode },

{ provide: 'LRU', useFactory: getLRU, deps: [] },
{ provide: AUTH_SERVICES, useFactory: UserService},
CacheService
]

})

app.node.module.ts

@NgModule({
bootstrap: [ AppComponent ],
declarations: [ AppComponent ],
imports: [
UniversalModule, // NodeModule, NodeHttpModule, and NodeJsonpModule are included
FormsModule,

SharedModule,
HomeModule,
AboutModule,

NavbarModule,

AppRoutingModule
],
providers: [
{ provide: 'isBrowser', useValue: isBrowser },
{ provide: 'isNode', useValue: isNode },

{
provide: 'LRU',
useFactory: getLRU,
deps: [
[new Inject('LRU'), new Optional(), new SkipSelf()]
]
},
{ provide: AUTH_SERVICES, useFactory: ServerAuthenticationService },
CacheService
]
})

那么如何在客户端通过路由器转换导航到该页面时与通过浏览器刷新在服务器上导航到该页面时输出相同的页面?

提前致谢

最佳答案

在节点中,您可以在快速应用程序中使用请求和响应属性,并将它们注入(inject)到基于浏览器模块服务器的 Angular 应用程序中。 request.cookies持有将 KVPS 映射到您的 cookie 的对象。

有关这方面的一些(过时的)示例,请查看此处和此处: https://github.com/angular/universal-starter/blob/master/src/node.module.ts#L43 https://github.com/angular/universal-starter/blob/master/src/browser.module.ts#L52

代码可能很快就会过时,但原则是成立的。使用依赖项注入(inject)在您的应用程序的服务器上注入(inject)请求,并在浏览器版本中注入(inject)一些请求 stub (可能仍会暴露浏览器 cookie)。

关于angular - angular 2 universal,nodejs中的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40523537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com