Angular 8: второй сервис вызывает URL-адрес параметра HTTP-запроса, изменяется при успешном первом вызове и работает после обновления страницы вручную - PullRequest
0 голосов
/ 30 января 2020

Я новичок в angular, я вызываю два вызова службы в конструкторе моего login.component.ts, где первый вызов является успешным, чтобы получить токен доступа, и используя этот токен доступа, я должен сделать еще один API вызов, для которого параметр url изменяется и выбрасывает 404, не найден, локально работает, но когда я размещаю его на сервере, возникает ошибка в zone-evergreen. js .pre-build-optimizer. js. Я пробовал много способов, кажется, ничего не работает, ниже прикрепил скриншот ошибки, вот мой код.

service.ts

const endpoint = "https://server.mydjangoapi.org/mywebapi";
export class restapiService {
  baseurl: string;
  constructor(private http?: HttpClient,
    public dataservice?: DataInteractionService,
    @Inject('BASE_URL') baseUrl?: string) {
    this.baseurl = baseUrl;
  }

private handleError(error) {      
    return throwError(error);    
  }
//Because we are not using a type checker, so the response should be extracted. Add this function after the constructor for extract it.
  private extractData(res: Response) {
    let body = res;
    return body || {};
  }
//Service call for authentication
  getAccessToken(authcode: any): Observable<any> {
    try {
      var jsonstring = { "grant_type": "authorization_code", "code": authcode, "client_id": "Django" }
      var formData = new FormData();
      Object.keys(jsonstring).forEach((key) => { formData.append(key, jsonstring[key]) });
      return this.http.post<any>("https://somegettoken.org/o/token/", formData).pipe(map(this.extractData), 
      catchError(this.handleError));
    } catch (error) {
      console.log(error);
    }

  }

  getUser(accesstoken_param?: any): Observable<any> {
    try {
      var accesstoken = '';
      if (isNullOrUndefined(this.dataservice.accesstoken)) {
        accesstoken = sessionStorage.getItem("accesstoken")
      }
      else {
        accesstoken = this.dataservice.accesstoken
      }

      var authheader = {
        headers: new HttpHeaders({

          'accesstoken': accesstoken,
          'Content-Type': 'application/json',
        })
      };
      return this.http.get(endpoint + "/getuser/prod/?format=json", authheader).pipe(map(this.extractData), 
      catchError(this.handleError));
    } catch (error) {
      console.log(error);
    }
  }
}

логин. component.ts

export class LoginComponent implements OnInit {
  accesstoken: any;
  auth_code: any;
  baseurl: any;
  application: string;

  constructor(private route: ActivatedRoute,
    private service: myrestapiService,
    private datainteraction: DataInteractionService,
    private router: Router, @Inject('BASE_URL') baseUrl: string) {

    this.baseurl = baseUrl;
    console.log(this.baseurl);
    this.route.queryParams.subscribe(params => {

      if (params['state']) {
        if (params['state'] === "myutility") {
          this.application = "appliance"
        }
        else {
          this.application = params['state'];
        }
        sessionStorage.setItem("screen", "search");
      }
      else {
        this.application = "appliance"
      }
      //if params and session not defined redirects to the login page of another application which returns auth_code and comes back to my appliaction
      if (!params['code'] && !sessionStorage.getItem("userGroupInfo")) {
        window.location.href = 'https://myatuhorizesite.org/o/authorize/?response_type=code&client_id=Django&redirect_uri=' + this.baseurl + '%23/login&state=' + this.application;
      }
      else {
        datainteraction.accesstoken = "";
        if (params['code']) {

        // if auth_code is there get the access_token using authcode
        service.getAccessToken(params['code']).subscribe((data) => {
            datainteraction.accesstoken = data.access_token
            sessionStorage.setItem("accesstoken", data.access_token);

            // get user details using access_token
            service.getUser().subscribe((data1) => {
              sessionStorage.setItem("userGroupInfo", JSON.stringify(data1));
                  datainteraction.userGroupInfo = JSON.parse(sessionStorage.getItem("userGroupInfo"));
              this.navigate();
            })
          },
            err => {
              window.location.href = 'https://myatuhorizesite.org/o/authorize/?response_type=code&client_id=Django&redirect_uri=' + this.baseurl + '%23/login&state=' + this.application;
            })
        }
        else {
          datainteraction.userGroupInfo = JSON.parse(sessionStorage.getItem("userGroupInfo"));
          this.navigate();
        }
      }
    });
  }

  ngOnInit() {

  }

  navigate() {
    if (this.application) {
      sessionStorage.setItem("apptype", this.application);
      this.datainteraction.apptype = this.application;
    }

    if (!sessionStorage.getItem("apptype")) {
      sessionStorage.setItem("apptype", this.application);
    }

    if (!sessionStorage.getItem("screen")) {
      this.router.navigate(['/home']);
    } else {
      this.router.navigate(['/home/' + sessionStorage.getItem("screen")]);
    }
  }
}

Примечание: Я не хочу передавать токен доступа в качестве параметра параметру sevice.getuser (), я хочу получить к нему доступ согласно логу c определено в service.getuser () Api call error

Примечание : когда используется перенаправление для входа в систему, мое приложение переходит к своему приложению под URL, чтобы получить код авторизации, где account / login /? Next = добавляется к моей конечной точке, показанной на снимке экрана при выполнении второго вызова API https://myatuhorizesite.org/accounts/login/?next=https: //myatuhorizesite.org/o/authorize/? Response_type = код & client_id = Джанго & redirect_uri =% 3Dhttps% 3A // myapplication.org / mywebapp /% 2523 / Войти% 26state% 3Dabcapp

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