URI бесшумного перенаправления не вызывается с использованием oid c -client - PullRequest
0 голосов
/ 05 августа 2020

Мы пытались обновить токен в автоматическом режиме (refre sh token), используя библиотеку Oid c -Client. Мы смогли успешно войти в систему. Но как только токен пользователя истек, страница тихого обратного вызова не вызывается, даже если она настроена, как показано ниже. Пожалуйста, помогите, если что-то отсутствует или исправьте заново. Также URI тихого перенаправления настроен на сервере идентификации как один из redirect_uri.

Login.ts

Office.initialize = function () {  
     var settings = {
      authority: "https://xxxx.xxxxx.com/xxxx/v1", 
      client_id: "https://xxx.xxx.com/",
      redirect_uri: "https://localhost:3000/taskpane.html",
      post_logout_redirect_uri: "https://localhost:3000/logout.html", 
      revokeAccessTokenOnSignout: true,      
      response_type: "id_token token",
      scope: "openid read:xxxx read:xxxx",
      state: true,
      filterProtocolClaims: true,  
      loadUserInfo: true,
      nonce:true, 
      clearHashAfterLogin: true,
      automaticSilentRenew: true,     
      silent_redirect_uri: 'https://localhost:3000/silent-refresh.html',      
      monitorsession:true,  
      metadata: {        
        issuer: 'https://xxx.xxx.com/xxx/v1',                    
        authorization_endpoint:  "https://xxx.xxx.com/xxxxx/v1/connect/authorize"                  
       
    }    
    };
    
    var mgr = new Oidc.UserManager(settings);
    mgr.signinRedirect();
    
mgr.events.addAccessTokenExpiring(function(){
    console.log("token expiring...");
}); 

}

silent-refre sh. html

<head>
    <title>RefreshToken</title>
    <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
</head>
<body>
    <script type="text/javascript" src=https://cdnjs.cloudflare.com/ajax/libs/oidc-client/1.10.0/oidc-client.js></script>
<script>
    new Oidc.UserManager().signinSilentCallback().then((user)=>
    { consolse.log("silentrenewed");}
    )
        .catch((err) => {
            console.log(err);
        });
        
</script>
</body>

Auth.ts

import { UserManager, WebStorageStateStore } from "oidc-client";

export default class AuthSigninService {
  private userManager: UserManager;

  constructor() {
  
      const settings: any = {
        ..................
        automaticSilentRenew: true,                                        
      accessTokenExpiringNotificationTime: 4,   
        silent_redirect_uri: "https://localhost:3000/taskpane.html",      
        monitorsession:false,  
             };

      this.userManager = new UserManager(settings);
    }
    
    public signin()
    {
        return this.userManager.signinRedirect();
    }  

      
  public async silentRenew() {
    try {
      const user = await this.userManager.signinSilentCallback().then((success) => {
        console.log("silentrenewed");
        console.log(success);
      }
      )
        .catch((err) => {
          console.log(err);
        });

    }
    catch (err) {
      console.log(err);
    }
    } 
}

taskpane.ts

document.getElementById('btnSilent').onclick = SilentRenew;

async function SilentRenew() {

  const auth = new AuthSigninService();
  auth.silentRenew();
   
}

1 Ответ

0 голосов
/ 06 августа 2020

Возможные причины:

  • Что-то связанное со встроенным скриптом
  • Возможно, второй экземпляр UserManager также необходимо инициализировать с настройками

ЧТО Я БЫ ПОПРОБОВАЛ

  • В главном окне вызовите await mgr.signInSilent (); чтобы выполнить автоматическое обновление «по требованию» и посмотреть, получится ли вывод console.log.

  • Сделайте код iframe частью основного приложения, а не запускайте его встроенным в HTML страница

ЧТО-ТО ДЛЯ СРАВНЕНИЯ ПРОТИВ

Мой пример кода выполняет автоматическое обновление iframe, а код спа может дать вам некоторые идеи.

Я предпочитаю устанавливать URI беззвучного обновления на главную страницу index. html, что мне проще. Затем напишите такой код:

if (window.top === window.self) {

    // If index.html is running on the main window, run the app
    const app = new App();
    app.execute();

} else {
  
    // If index.html is running on an iframe, handle token renewal responses
    const app = new IFrameApp();
    app.execute();

}

Вот, кстати, мой код OAuth .

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