Получите обновленный токен Azure AD, используя Adal Angular - PullRequest
0 голосов
/ 13 ноября 2018

Я использую "adal-angular6": версия "1.0.68".

Вот моя конфигурация ::

private config = {
    tenant: environment.appId,     // tenantId.
    clientId: environment.clientId,
    redirectUri: environment.origin + '/auth-callback', // callback URI.
    postLogoutRedirectUri: environment.origin,
    cacheLocation: 'localStorage',
};

Я не получаю токен обновления, когда я звоню adalService.acquireToken('https://graph.microsoft.com'). Я затуманиваю какую-то конфигурацию?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Я попытаюсь дать свой код, который работает, но который не использует обертку adal-angular6, а скорее официальную adal-angular из AzureAD.

Это моя angular.json часть, которая загружаетlibrary:

{
  ...
  "projects": {
    "my-app": {
      ...
      "architect": {
        "build": {
          ...
          "options": {
            ...
            "scripts": [
              "node_modules/adal-angular/dist/adal.min.js"
            ]

Это часть моей службы аутентификации, которая инициализирует библиотеку:

declare var AuthenticationContext;
@Injectable(...)
export class AuthService {
  adalConfig = {
    tenant: '*******.com',
    clientId: '12345678-9abc-def0-1234-56789abcdef0',
    redirectUri: environment.redirectPath,
    postLogoutRedirectUri: environment.redirectPath,
    cacheLocation: 'localStorage',
  };

  authContext;

  constructor(http: HttpClient) {
    this.authContext = new AuthenticationContext(this.adalConfig);
  }

  acquireToken(): Observable<string> {
    const func: (a: string, c: (error, token: string) => void) => void = (a, c) => {
      (this.authContext.acquireToken.bind(this.authContext))(a, c);
    };
    const bound = bindCallback(func);
    return bound(this.authContext.config.clientId).pipe(map(([e, r]) => r));
  }
  ...
}

И это то, что происходит в моем перехватчике перед каждым вызовом Ajax:

@Injectable()
export class TokenInterceptor implements HttpInterceptor {
  constructor(auth: AuthService, route: Router) { }

  intercept(request: HttpRequest<any>, next: HttpHandler):
    Observable<HttpSentEvent
    | HttpHeaderResponse
    | HttpProgressEvent
    | HttpResponse<any>
    | HttpUserEvent<any>> {
    const tokenGetter = this.auth.acquireToken();
    const rc = tokenGetter.pipe(
      take(1),
      switchMap(r => {
        const req2 = r && request.clone({
          setHeaders: {
            Authorization: `Bearer ${r}`
          }
        }) || request;
        return next.handle(req2).pipe(
          tap(null, (err: HttpErrorResponse) => {
            if (err.status === 401) {
              ... // handle auth errors, auth again, save url and remake call, etc...
            }
          }),
          catchError((e, c) => { ... })
        );
      }));
    return rc;
  }

Единственное, что странно в вышесказанном, это то, что acquireToken библиотеки принимает функцию обратного вызова, и я преобразую ее в наблюдаемую, используя rxjs bindCallback, но в остальном она просто работает.

Обратите внимание, что метод acquireToken не принимает никаких аргументов (вопреки тому, что я сказал в комментарии к вопросу).

0 голосов
/ 13 ноября 2018

Нет, вы не можете получить токены обновления в интерфейсе.

Вам необходим клиентский секрет для обмена токенов обновления на новые токены доступа, и вы не можете поместить секрет в код Javascript, так как он виден всем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...