【问题标题】:Angular 2 - Auth0角 2 - Auth0
【发布时间】:2017-01-10 01:44:25
【问题描述】:

我正在尝试实现从 Auth0 登录和注册。我从 Auth0 网站按照以下步骤操作:

https://auth0.com/docs/quickstart/spa/angular2/01-login

我正在使用 Angular 2 RC5

这是我的文件的样子:

app.component.html

 <div class="navbar-header">
 <a class="navbar-brand" href="#">Auth0 - Angular 2</a>
<button class="btn btn-primary btn-margin" (click)="auth.login()" *ngIf="!auth.authenticated()">Log In</button>
<button class="btn btn-primary btn-margin" (click)="auth.logout()" *ngIf="auth.authenticated()">Log Out</button>
</div>

app.component.ts

从'@angular/core'导入{组件}; 从“./auth.service”导入{Auth};

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
constructor(private auth: Auth) {}
}

auth.service.ts

import { Injectable }      from '@angular/core';
import { tokenNotExpired } from 'angular2-jwt';

// Avoid name not found warnings
declare var Auth0Lock: any;

@Injectable()
export class Auth {
  // Configure Auth0
  lock = new Auth0Lock('MY_CLIENT_ID', 'MY_DOMAIN.auth0.com', {});

  constructor() {
    // Add callback for lock `authenticated` event
    this.lock.on("authenticated", (authResult) => {
      localStorage.setItem('id_token', authResult.idToken);
    });
  }

  public login() {
    // Call the show method to display the widget.
    this.lock.show();
  };

  public authenticated() {
    // Check if there's an unexpired JWT
    // This searches for an item in localStorage with key == 'id_token'
    return tokenNotExpired();
  };

  public logout() {
    // Remove token from localStorage
    localStorage.removeItem('id_token');
  };
}

但是我在我的 Chrome 开发者 JavaScript 控制台中遇到了这些错误:

EXCEPTION: Error in ./AppComponent class AppComponent_Host - inline template:0:0
EXCEPTION: Error in ./AppComponent class AppComponent_Host - inline template:0:0
ORIGINAL EXCEPTION: No provider for Auth!
ORIGINAL STACKTRACE:
Error: DI Exception
    at NoProviderError.BaseException [as constructor] (exceptions.js:27)
    at NoProviderError.AbstractProviderError [as constructor] (reflective_exceptions.js:43)
    at new NoProviderError (reflective_exceptions.js:80)
    at ReflectiveInjector_._throwOrNull (reflective_injector.js:786)
    at ReflectiveInjector_._getByKeyDefault (reflective_injector.js:814)
    at ReflectiveInjector_._getByKey (reflective_injector.js:777)
    at ReflectiveInjector_.get (reflective_injector.js:586)
    at NgModuleInjector.get (ng_module_factory.js:98)
    at DebugAppView._View_AppComponent_Host0.createInternal (AppComponent.ngfactory.js:16)
    at DebugAppView.AppView.create (view.js:101)
ERROR CONTEXT:
DebugContext {_view: _View_AppComponent_Host0, _nodeIndex: 0, _tplRow: 0, _tplCol: 0}_nodeIndex: 0_staticNodeInfo: (...)_tplCol: 0_tplRow: 0_view: _View_AppComponent_Host0component: (...)componentRenderElement: (...)context: (...)injector: (...)providerTokens: (...)references: (...)renderNode: (...)source: (...)__proto__: Object
Unhandled Promise rejection: EXCEPTION: Error in ./AppComponent class AppComponent_Host - inline template:0:0
ORIGINAL EXCEPTION: No provider for Auth!
ORIGINAL STACKTRACE:
Error: DI Exception
    at NoProviderError.BaseException [as constructor] (http://localhost:4200/main.bundle.js:1867:23)
    at NoProviderError.AbstractProviderError [as constructor] (http://localhost:4200/main.bundle.js:29230:16)
    at new NoProviderError (http://localhost:4200/main.bundle.js:29267:16)
    at ReflectiveInjector_._throwOrNull (http://localhost:4200/main.bundle.js:58584:19)
    at ReflectiveInjector_._getByKeyDefault (http://localhost:4200/main.bundle.js:58612:25)
    at ReflectiveInjector_._getByKey (http://localhost:4200/main.bundle.js:58575:25)
    at ReflectiveInjector_.get (http://localhost:4200/main.bundle.js:58384:21)
    at NgModuleInjector.get (http://localhost:4200/main.bundle.js:42059:52)
    at DebugAppView._View_AppComponent_Host0.createInternal (AppComponent.ngfactory.js:16:70)
    at DebugAppView.AppView.create (http://localhost:4200/main.bundle.js:59148:21)
ERROR CONTEXT:
[object Object] ; Zone: <root> ; Task: Promise.then ; Value: ViewWrappedException {_wrapperMessage: "Error in ./AppComponent class AppComponent_Host - inline template:0:0", _originalException: NoProviderError, _originalStack: "Error: DI Exception↵    at NoProviderError.BaseExc…e (http://localhost:4200/main.bundle.js:59148:21)", _context: DebugContext, _wrapperStack: "Error: Error in ./AppComponent class AppComponent_… at http://localhost:4200/main.bundle.js:27889:27"}
Error: Uncaught (in promise): EXCEPTION: Error in ./AppComponent class AppComponent_Host - inline template:0:0(…)

网页是空白的。什么都没有出现。

任何帮助将不胜感激。

干杯,

【问题讨论】:

    标签: javascript node.js angular auth0


    【解决方案1】:

    这就是我的实现方式,并且运行良好 Code Geek

    app.module.ts

     import { AUTH_PROVIDERS } from 'angular2-jwt';
     import { Auth } from './services/auth0.service';
    
    
        @NgModule({
          declarations: [
            AppComponent
          ],
          imports: [
            BrowserModule,
            FormsModule,
            HttpModule
          ],
          providers: [AUTH_PROVIDERS, Auth],
          bootstrap: [AppComponent]
        })
        export class AppModule { }
    

    index.html

    <!doctype html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>Angular2Auth0</title>
      <base href="/">
    
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="icon" type="image/x-icon" href="favicon.ico">
      <script src="http://cdn.auth0.com/js/lock/10.2/lock.min.js"></script>
    </head>
    <body>
      <app-root>Loading...</app-root>
    </body>
    </html>
    

    app.component.ts

    import { Component } from '@angular/core';
    import { Auth } from './services/auth0.service';
    
    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
    })
    
    export class AppComponent {
    
      constructor(private auth: Auth) {
        console.log(auth);
      }
    
    
    }
    

    【讨论】:

    【解决方案2】:

    这对我有用:

    `import { Injectable } from '@angular/core'; 从'@angular/router'导入{路由器,CanActivate,ActivatedRouteSnapshot,RouterStateSnapshot};

    @Injectable() 导出类 AuthGuard 实现 CanActivate {

    constructor(private router: Router) { }
    
    public canActivate(route: ActivatedRouteSnapshot, state: `enter code here`RouterStateSnapshot) {
        if (localStorage.getItem('userId')) {
            return true;
        }
    
        // not logged in so redirect to login page with the return url
        this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });
        return false;
    }
    

    }`

    在路由器中使用这个: export const ROUTES: Routes = [ { path: '', component: YourComponent, canActivate: [AuthGuard]} ];

    并在登录设置本地存储: localStorage.setItem('userId', id);

    【讨论】:

      【解决方案3】:

      在组件元数据中,添加:-

      providers: [Auth]
      

      Using services

      或者:-

      将其包含在您的 ngModule 元数据中:-

      import { NgModule }      from '@angular/core';
      import { BrowserModule } from '@angular/platform-browser';
      import {Auth} from 'your path'
      @NgModule({
        imports: [
          //your imports
       ],
      
       bootstrap: [//your component],
       providers: [Auth]
      

      })

      Refer here

      【讨论】:

        【解决方案4】:

        步骤未提及,但您需要在 index.html 中添加以下脚本。

         <script src="http://cdn.auth0.com/js/lock/10.2/lock.min.js"></script>
        

        当我做这个网站开始加载时,现在我得到一个不同的错误。

        core.umd.js?e2a5:3462 例外:./AppComponent 类 AppComponent 中的错误 - 内联模板:4:70 原因:无法读取未定义的“已验证”属性

        如果我能解决这个问题,我会及时通知你。

        【讨论】:

        • 我得到了它的工作,我在组件构造函数中给出了一个不同的名称(而不是 auth,我给出了身份验证)。愚蠢的错误花费了我半个小时。构造函数(私有 api:ApiService,私有身份验证:Auth){...}
        猜你喜欢
        • 2016-10-28
        • 2017-04-03
        • 2018-05-20
        • 2020-03-08
        • 2017-05-18
        • 2017-12-08
        • 2016-08-04
        • 2019-02-08
        • 2015-04-27
        相关资源
        最近更新 更多