Angular:在任何http请求之前获取api访问令牌

时间:2017-05-21 12:52:27

标签: angular

我正在使用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项服务:

  • UserService
  • ApiService
  • OAuthService

我找出了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调用将引发未经授权的异常。承诺将是一种方式,因为它是一个单一的事件,我是对的吗?

请告诉我,我对所有这些选择感到有些困惑。

0 个答案:

没有答案