Как мне выполнить трехэтапную авторизацию из интерфейсного приложения?

#oauth-2.0 #autodesk-forge

#oauth-2.0 #autodesk-forge

Вопрос:

У меня возникли проблемы с настройкой трехэтапной авторизации для подключения к Autodesk BIM360, настроенной на моем интерфейсе. Серверная часть (localhost: 8080) работает, например, простой интерфейс, который может получать доступ и отображать данные из BIM360, но я не могу заставить работать интерфейс (localhost: 3000). Я могу заставить 2-этапную авторизацию работать, но поскольку для 3-этапа требуется вход в систему, и я не уверен, как к этому подойти.

Для двухэтапного OAuth (на интерфейсе) Я использовал:

 const getToken = async () => {
  const { data } = await axios.get(url_base   'api/forge/oauth2lo/token');
  //console.log(data.access_token);
  return data.access_token;
};
  

Но трехэтапная настройка более сложна. Сначала настраивается класс OAuth:

 class OAuth {
  constructor(session) {
    this._session = session;
  }

  getClient(scopes = config.scopes.internal) {
    const { client_id, client_secret, callback_url } = config.credentials;
    return new AuthClientThreeLegged(
      client_id,
      client_secret,
      callback_url,
      scopes
    );
  }
...
  

и соответствующие маршруты:

 ...
router.get('/callback/oauth', async (req, res, next) => {
  console.log(req);
  const { code } = req.query;
  const oauth = new OAuth(req.session);
  try {
    await oauth.setCode(code);
    res.redirect('/');
  } catch (err) {
    next(err);
  }
});

router.get('/oauth/url', (req, res) => {
  const url =
    'https://developer.api.autodesk.com'  
    '/authentication/v1/authorize?response_type=code'  
    'amp;client_id='  
    config.credentials.client_id  
    'amp;redirect_uri='  
    config.credentials.callback_url  
    'amp;scope='  
    config.scopes.internal.join(' ');
  res.end(url);
});
...
  

Во внешнем интерфейсе я попытался вызвать '/oauth/url' путь, и он выводит меня на экран входа в систему, но сеанс входа остается на серверной части (на localhost: 8080) и, следовательно, не может получить доступ к данным BIM360 во внешнем интерфейсе.

Мой вопрос в том, как я могу войти в учетную запись Autodesk на интерфейсе и выполнить трехэтапную авторизацию, чтобы иметь возможность вызывать API BIM360 из серверной части?

Ответ №1:

Хотя более распространено обрабатывать трехэтапную авторизацию с использованием предоставления кода авторизации на стороне сервера, вы можете использовать альтернативную «неявную» трехэтапную аутентификацию от клиента: https://forge.autodesk.com/en/docs/oauth/v2/tutorials/get-3-legged-token-implicit . Таким образом, после входа пользователя в систему Autodesk перенаправит его на ваш URL обратного вызова следующим образом:

 https://your.custom.app/callback#access_token=<token>amp;token_type=Beareramp;expires_in=<seconds>
  

И ваш код JavaScript на стороне клиента может затем извлечь код доступа следующим образом:

    var params = {},
       queryString = location.hash.substring(1),
       regex = /([^amp;=] )=([^amp;]*)/g,
       m;
   while (m = regex.exec(queryString)) {
     params[m[1]] = m[2];
   }
   alert("your access token is : "   params["access_token"]);
  

Комментарии:

1. Означает ли это, что мне понадобятся 2 зарегистрированных приложения Forge? Поскольку uri перенаправления должен соответствовать регистрации приложения (которое в настоящее время является сервером).

2. Я не уверен, что было бы хорошей идеей иметь 3-этапную аутентификацию как на стороне сервера, так и на стороне клиента. Вы должны просто выбрать один. Обычно 3-этапная авторизация обрабатывается на стороне сервера, а токен доступа затем сохраняется в сеансе cookie (как описано в этом руководстве: learnforge.autodesk.io/#/oauth/3legged ).