#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 ).