我已经为 @angular/Http 创建了一个包装服务,以添加持有者身份验证的逻辑和 Http 请求的计数器。
我想使用此自定义服务来替换微风的服务。如何做到这一点?
这是我的包装器的最简单版本
@import {Injectable} from '@angular/core'
import {Http, Headers} from '@angular/Http'
import {AuthService} from './auth.service'
@Injectable()
export class AuthHttpService
{
constructor(private http: Http, private authService: AuthService){}
get = (url: string){
//some logic for bearer authenticated calls
let params = {
// request extra info
};
return this.http.get(url, params);
}
}
我的微风管理器织物服务。可以看到身份验证持有者逻辑。我想让持有者附加代码并更改整个 Breeze 的 Http 服务。
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable, Scheduler } from 'rxjs/Rx';
import { LocalStorage, SessionStorage } from 'ng2-webstorage';
import { config, NamingConvention, EntityManager, EntityQuery, DataService, MetadataStore } from 'breeze-client';
import { AuthenticationService } from '../authentication/authentication.service';
import { BreezeProvider } from './breeze.provider.service';
import { Constants } from '../constants.class';
@Injectable()
export class EntityManagerProvider {
constructor(private provider: BreezeProvider, authenticationService: AuthenticationService) {
NamingConvention.camelCase.setAsDefault();
let ajaxAdapter = <any>config.getAdapterInstance('ajax', 'angular');
let headers = ajaxAdapter.defaultSettings['headers'] || {};
headers['Authorization'] = 'Bearer ' + authenticationService._userData.accessToken;
ajaxAdapter.defaultSettings['headers'] = headers;
}
}
我一直在寻找在微风文档站点找到这个截图时的任何示例:
angular.module('app').run(['$http', function($http) {
var ajax = breeze.config.initializeAdapterInstance('ajax', 'angular');
ajax.setHttp($http); // use the $http instance that Angular injected into your app.
}]);
这个例子是针对angularjs的,但帮助我理解替换为
let ajaxAdapter = <any>config.getAdapterInstance('ajax', 'angular');
改为
let ajaxAdapter = <any>config.getAdapterInstance('ajax', 'angular');
ajaxAdapter.http = authService;
并删除硬编码的承载线
//let headers = ajaxAdapter.defaultSettings['headers'] || {};
//headers['Authorization'] = 'Bearer ' + authenticationService._userData.accessToken;
//ajaxAdapter.defaultSettings['headers'] = headers;
更新
我反向更新了 breeze 的默认设置,因为角度/http 方法使用默认设置。因此,持有者身份验证保留在自定义 http 提供程序的默认设置和其他逻辑人员中。
整个逻辑如下:
// Provider replacement
let ajaxAdapter = <any>config.getAdapterInstance('ajax', 'angular');
ajaxAdapter.http = authService;
//Default authentication settings
let headers = ajaxAdapter.defaultSettings['headers'] || {};
headers['Authorization'] = 'Bearer ' + authenticationService._userData.accessToken;
ajaxAdapter.defaultSettings['headers'] = headers;
与 Angular (2/4( 相关,我通过查看 Leonardo 在他的回答中如何处理它以及 Ward Bell 和团队的讨论,找到了我需要的大部分工作:
基本上,将 ajax 适配器替换为包含持有者令牌的您自己的授权版本。
每个病房:
import { AjaxAngular2Adapter } from 'breeze-bridge-angular2'; ...
// assume you injected auth0Http instance when you get here ... config.registerAdapter('ajax', () => new AjaxAngular2Adapter(auth0Http)); config.initializeAdapterInstance('ajax', AjaxAngular2Adapter.adapterName, true); ...
在我的特定情况下,这意味着更改我的实体管理器提供程序并注入我的身份验证服务:
if (this.authService.isAuthenticated()) {
config.registerAdapter('ajax', () => new AjaxAngular2Adapter(<any>this.authService.authHttp));
config.initializeAdapterInstance('ajax', AjaxAngular2Adapter.adapterName, true);
}
// Unrelated, but including for context....
let dsconfig: DataServiceOptions = {
serviceName: EntityManagerProvider.serviceName
};
let dataService = new DataService(dsconfig);
let masterManager = EntityManagerProvider._masterManager = new EntityManager({
dataService: dataService
});
我仍在尝试解决未创建实体管理器提供程序但稍后登录时未对用户进行身份验证的情况。有一些关于不在链接中抛出 jwt 错误的讨论,但我还没有完全弄清楚。