我正在使用Angular 4(Angular 2)构建应用程序。
我构建了一个需要OAuth访问令牌的API。
通过调用此路线提供令牌:
GET / oauth / v2 / token?client_id = CLIENT_ID& client_secret = CLIENT_SET& grant_type = client_credentials
提供的令牌将在3600秒后过期,因此客户端应用程序必须要求新的访问令牌(使用提供的刷新令牌)。
在AngularJs(1. *)中,我正在使用拦截器来解决这个问题。因为拦截器不再是Angular的一部分了。
假设我有3项服务:
我找出了2个选项:
选项1:
ApiService将扩展Http提供程序,如article中所述。
stackoverflow上有人试图使用类似的东西 solution
因此,在任何http请求中,如果过期,我将能够调用服务器来请求新的访问令牌。有关访问令牌的所有逻辑(cookie存储,过期,有效访问等)都将在OAuthServie中。
选项2:
ApiService不会扩展Http,只是将其用作服务。
这里的例子是:
UserService
export class UserService {
constructor(private apiService: ApiService) { }
getUsers(): Promise<User[]> {
return this.apiService.get('/users').toPromise()
.then(response => response.json() as User[])
.catch(this.handleError);
}
/* ... */
}
ApiService
export class ApiService {
constructor(private http: Http, private oAuthService: OAuthService) { }
/**
* name: get
* params:{String} url
*/
get(url: string) {
// Using Observable or Promise (promise is used as pure exemple here)
// GET ACCESS TOKEN
return this.oAuthService.getAccessToken().then((accessToken) =>
// ADD TOKEN TO HEADER
let headers = new Headers();
headers.append('Authorization', 'Bearer ' + accessToken);
// CALL API (/api/users for exemple)
return this.http.get(environment.apiEndpoint + url, {
headers: headers
});
);
}
}
OAuthService:
export class OAuthService {
private accessToken: string;
constructor(public cookieService: CookieService, public http: Http) { }
getAccessToken() {
this.accessToken = this.cookieService.get('access_token');
if(!hasValidAccessToken) {
return this.http.get('/oauth/v2/token?client_id=CLIENT_ID&client_secret=CLIENT_SET&grant_type=client_credentials').toPromise()
.then(response => response.json())
.catch(this.handleError);
}
}
else {
return this.accessToken;
}
}
/**
* Check validity of token, exist, expire, etc.
*/
hasValidAccessToken() {}
}
所以我想知道哪种选择最适合做这种事情?否则你会建议考虑什么其他选项,而访问令牌将在3600秒后过期?
两个选项都需要promise或observable才能请求api调用。否则,如果尚未获得访问令牌,则api调用将引发未经授权的异常。承诺将是一种方式,因为它是一个单一的事件,我是对的吗?
请告诉我,我对所有这些选择感到有些困惑。