- 基本情報
- Studio Web での UiPath Agents
- UiPath のコード化されたエージェント

Agents ガイド
匿名アクセスの設定
概要
匿名アクセスを使用すると、UiPath アカウントを持たないユーザー向けに会話型エージェントを埋め込むことができます。これは、顧客向けアプリケーション、パブリック ポータル、およびユーザーが UiPath の認証を必要とせずにエージェントと対話できるようにするシナリオで便利です。
匿名アクセスには以下が必要です。
- UiPath の [管理] で設定された機密の外部アプリケーション
- 認証を処理するために組織によってホストされたトークン エンドポイント
- 認証パラメーターが設定された埋め込みエージェントの URL
機密アプリのスコープの外部アプリでは、ユーザー認証なしで匿名アクセスが許可されます。意図しないデータ アクセスを防止するため、権限は慎重に設定してください。悪用を減らすため、匿名エージェントは、独自のポータルまたはログインの背後に配置することを強くお勧めします。
対象ユーザー: Automation Cloud アカウントなしで会話型エージェントにアクセスする必要があるユーザー。
前提条件
開始する前に、以下があることを確認してください。
- Orchestrator にパブリッシュ済みの会話型エージェント
- UiPath 管理ポータルへの組織管理者アクセス
- サーバーレス関数または API エンドポイントをホストするインフラストラクチャ (AWS Lambda、Azure Functions、Google Cloud Functions など)
手順 1: 外部アプリケーションを作成する
- UiPath のホームページから [管理] に移動します。
- [外部アプリケーション] を選択します。
- [アプリケーションを追加] をクリックします。
- アプリケーションの詳細を入力します。
- アプリケーション名: アプリケーションにわかりやすい名前を付けます。
- アプリケーションの種類: [機密アプリケーション] を選択します。
- 以下のスコープをアプリケーション スコープとして追加します。
| API | スコープ |
|---|---|
| Orchestrator API アクセス | OR.Jobs |
| Orchestrator API アクセス | OR.Execution |
| Orchestrator API アクセス | OR.Users |
| Orchestrator API アクセス | OR.Folders |
| トレース API アクセス | Traces.Api |
| 会話型エージェント | ConversationalAgents |
- [追加] をクリックします (このクライアントにはリダイレクト URL は必要ありません)。
- ポップアップにアプリ ID とアプリ シークレットが表示されます。
アプリ シークレットをコピーして安全に保管します。このウィンドウを閉じると、再度表示することはできなくなります。トークン エンドポイントを作成するときに必要になります。
スコープをアプリケーション スコープではなくユーザー スコープとして追加すると、チャット アプリでユーザーのサインインが要求され、匿名アクセスの目的を果たせません。
手順 2: 外部アプリケーションの権限を設定する
外部アプリケーションを作成したら、匿名エージェントがアクセスできるリソースを制御するための権限を設定します。
テナント レベルのアクセス権を割り当てる
- Orchestrator に移動します。
- 左上の [テナント] を選択します。
- ツールバーから [アクセス権を管理] を選択します。
- [外部アプリ] を選択します。
- [外部アプリを割り当て] を選択します。
- 作成した外部アプリを検索して選択します。
- [追加のロール] で、必要なロールを選択します。
- 最低限必要なロール: Automation User。
- その他のロールは、ユース ケースに必要な場合にのみ追加します。
- [割り当て] を選択します。
フォルダー レベルのアクセス権を割り当てる
- Orchestrator でフォルダーに移動します。
- エージェントがアクセスする必要のあるフォルダーごとに、以下を行います。
- フォルダーを選択します。
- [アカウント/グループ/外部アプリを割り当て] を選択します。
- ドロップダウンから外部アプリを選択します。
- 必要なロールを割り当てます。
- [割り当て] を選択します。
外部アプリは、そのアプリが明示的な権限を持たないリソースに対しては制限されます。会話型エージェントに必要なすべてのコンテキスト、ツール、リソースにアプリがアクセスできることを確認してください。
手順 3: トークン エンドポイントを作成する
埋め込みの会話型エージェントはクライアント シークレットを安全に保存できないため、トークン エンドポイントが必要です。トークン エンドポイントは、クライアント資格情報を使用して UiPath で認証を行い、埋め込みエージェントにアクセス トークンを返します。
推奨アーキテクチャ
トークン エンドポイントには、以下の理由でサーバーレス アーキテクチャをお勧めします。
- コストが低い: たとえば、AWS Lambda の場合、3,000,000 応答/月の料金は約 0.40 米ドルです。
- メンテナンスが最小限: 管理すべきサーバーはありません。
- スケーリングが容易: トラフィックのスパイクに自動的に対応します。
セキュリティに関する考慮事項
クライアント シークレットは非常に機密性が高いものです。誤って公開してしまった場合は、直ちにそのシークレットを削除し、[外部アプリケーション] 設定で新しいシークレットを生成してください。
トークン エンドポイントの実装を確認します。
- クライアント シークレットを安全に保存する (環境変数、Secrets Manager)
- 要求のオリジンを検証して未認可のアクセスを防止する
- すべての通信に HTTPS を使用する
実装例
次の JavaScript コードは、ご使用のサーバーレス プラットフォームに合わせて変更できます。応答本文で {access_token: <token>} を返す必要があります。
// Whitelist: Configure allowed origins for your deployment
const ALLOWED_ORIGINS = [
'https://cloud.uipath.com/*',
// Add your application domains here
];
function matchesOriginPattern(origin, pattern) {
try {
const originUrl = new URL(origin);
const originBase = `${originUrl.protocol}//${originUrl.host}`;
if (pattern.includes('*')) {
const regexPattern = pattern
.replace(/[.+?^${}()|[\]\\]/g, '\\$&')
.replace(/\*/g, '.*');
const regex = new RegExp(`^${regexPattern}$`);
return regex.test(originBase);
} else {
return originBase.startsWith(pattern);
}
} catch (e) {
return false;
}
}
function checkOrigin(req) {
const origin = req.headers.origin || req.headers.referer;
if (!origin) {
const host = req.headers.host;
if (host && (host.includes('localhost') || host.includes('127.0.0.1'))) {
return true;
}
return false;
}
return ALLOWED_ORIGINS.some(pattern => matchesOriginPattern(origin, pattern));
}
async function getClientAccessToken() {
const clientId = process.env.CLIENT_ID;
const clientSecret = process.env.CLIENT_SECRET;
const scope = 'OR.Default ConversationalAgents Traces.Api';
const params = new URLSearchParams({
grant_type: 'client_credentials',
client_id: clientId,
client_secret: clientSecret,
scope: scope
});
const response = await fetch('https://cloud.uipath.com/identity_/connect/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: params.toString()
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`Token request failed: ${response.status} ${errorText}`);
}
const data = await response.json();
return data.access_token;
}
export async function token(context, req) {
if (!checkOrigin(req)) {
context.res = {
status: 403,
headers: { 'Content-Type': 'application/json' },
body: { error: 'Origin not allowed' }
};
return;
}
try {
const accessToken = await getClientAccessToken();
context.res = {
status: 200,
headers: { 'Content-Type': 'application/json' },
body: { access_token: accessToken }
};
} catch (error) {
console.error('Error fetching access token:', error);
context.res = {
status: 500,
headers: { 'Content-Type': 'application/json' },
body: { error: 'Failed to fetch access token' }
};
}
}
// Whitelist: Configure allowed origins for your deployment
const ALLOWED_ORIGINS = [
'https://cloud.uipath.com/*',
// Add your application domains here
];
function matchesOriginPattern(origin, pattern) {
try {
const originUrl = new URL(origin);
const originBase = `${originUrl.protocol}//${originUrl.host}`;
if (pattern.includes('*')) {
const regexPattern = pattern
.replace(/[.+?^${}()|[\]\\]/g, '\\$&')
.replace(/\*/g, '.*');
const regex = new RegExp(`^${regexPattern}$`);
return regex.test(originBase);
} else {
return originBase.startsWith(pattern);
}
} catch (e) {
return false;
}
}
function checkOrigin(req) {
const origin = req.headers.origin || req.headers.referer;
if (!origin) {
const host = req.headers.host;
if (host && (host.includes('localhost') || host.includes('127.0.0.1'))) {
return true;
}
return false;
}
return ALLOWED_ORIGINS.some(pattern => matchesOriginPattern(origin, pattern));
}
async function getClientAccessToken() {
const clientId = process.env.CLIENT_ID;
const clientSecret = process.env.CLIENT_SECRET;
const scope = 'OR.Default ConversationalAgents Traces.Api';
const params = new URLSearchParams({
grant_type: 'client_credentials',
client_id: clientId,
client_secret: clientSecret,
scope: scope
});
const response = await fetch('https://cloud.uipath.com/identity_/connect/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: params.toString()
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`Token request failed: ${response.status} ${errorText}`);
}
const data = await response.json();
return data.access_token;
}
export async function token(context, req) {
if (!checkOrigin(req)) {
context.res = {
status: 403,
headers: { 'Content-Type': 'application/json' },
body: { error: 'Origin not allowed' }
};
return;
}
try {
const accessToken = await getClientAccessToken();
context.res = {
status: 200,
headers: { 'Content-Type': 'application/json' },
body: { access_token: accessToken }
};
} catch (error) {
console.error('Error fetching access token:', error);
context.res = {
status: 500,
headers: { 'Content-Type': 'application/json' },
body: { error: 'Failed to fetch access token' }
};
}
}
環境変数
サーバーレス プラットフォームで以下の環境変数を設定します。
| 変数 | 説明 |
|---|---|
CLIENT_ID | 手順 1 のアプリ ID |
CLIENT_SECRET | 手順 1 のアプリ シークレット |
環境変数の正確な設定方法は、ご使用のホスティング プラットフォームによって異なります。
許可されたオリジンを設定する
ALLOWED_ORIGINS 配列は、未認可のソースからのトークン要求を拒否することによってセキュリティを提供します。このリストを、以下を含むように設定します。
https://cloud.uipath.com/*(埋め込みエージェントに必要)https://staging.uipath.com(ステージング環境からの要求を許可する必要がある場合)- アプリケーションのドメイン (ローカルで、または他の環境からテストする場合)
手順 4: 匿名アクセスを持つエージェントを埋め込む
トークン エンドポイントを設定したら、次の URL 形式を使用して会話型エージェントを埋め込みます。
https://<cloud_env>.uipath.com/<organization>/<tenant>/autopilotforeveryone_/conversational-agents/?agentId=<agent_id>&externalAuth=true&authEndpoint=<token_endpoint_url>&externalUserId=<user_id>
https://<cloud_env>.uipath.com/<organization>/<tenant>/autopilotforeveryone_/conversational-agents/?agentId=<agent_id>&externalAuth=true&authEndpoint=<token_endpoint_url>&externalUserId=<user_id>
匿名アクセス URL パラメーター
| パラメーター | Required | 説明 |
|---|---|---|
agentId | はい | パブリッシュ済みのエージェントのリリース ID です。 |
externalAuth | はい | 匿名アクセスを有効化するには true に設定します。 |
authEndpoint | はい | トークン エンドポイントの URL です。 |
externalUserId | はい | ユーザーの一意の識別子です (以下の注を参照)。 |
externalUserId は、ユーザーが定義および維持する値です。これにより、ユーザーのチャット履歴を分離および取得します。チャット履歴を維持する必要がある場合は意味のあるユーザー ID を使用します。チャット履歴を保持する必要がない場合はランダムな GUID を使用します。
埋め込み URL の例
https://<cloud_env>.uipath.com/myorg/mytenant/autopilotforeveryone_/conversational-agents/?agentId=12345&externalAuth=true&authEndpoint=https://my-api.example.com/token&externalUserId=user-abc-123
https://<cloud_env>.uipath.com/myorg/mytenant/autopilotforeveryone_/conversational-agents/?agentId=12345&externalAuth=true&authEndpoint=https://my-api.example.com/token&externalUserId=user-abc-123
HTML の例
<iframe
src="https://<cloud_env>.uipath.com/myorg/mytenant/autopilotforeveryone_/conversational-agents/?agentId=12345&externalAuth=true&authEndpoint=https://my-api.example.com/token&externalUserId=user-abc-123"
width="400"
height="600"
frameborder="0"
allow="clipboard-write"
></iframe>
<iframe
src="https://<cloud_env>.uipath.com/myorg/mytenant/autopilotforeveryone_/conversational-agents/?agentId=12345&externalAuth=true&authEndpoint=https://my-api.example.com/token&externalUserId=user-abc-123"
width="400"
height="600"
frameborder="0"
allow="clipboard-write"
></iframe>
externalAuth=true パラメーターが指定されていない場合、埋め込みエージェントは、匿名アクセスではなく標準のサインイン リダイレクト フローを使用します。
トラブルシューティング
トークン エンドポイントが 403 を返す
ALLOWED_ORIGINSのリストに正しいドメインが含まれていることを確認します。- 要求のオリジン ヘッダーが正しく送信されていることを確認します。
- エンドポイントを直接テストして、問題を切り分けます。
トークン要求が認証エラーで失敗する
CLIENT_ID環境変数とCLIENT_SECRET環境変数が正しく設定されていることを確認します。- UiPath の [管理] で、外部アプリケーションが現在もアクティブであることを確認します。
- コード内のトークン エンドポイント URL が正しい UiPath 環境を指していることを確認します。
エージェントがリソースにアクセスできない
- 外部アプリケーションに割り当てられているロールを Orchestrator で確認します。
- 必要なすべてのフォルダーに対してフォルダー レベルの権限が構成されていることを確認します。
- 外部アプリに追加したスコープが、必要な API アクセスに一致していることを確認します。
チャット履歴が保持されない
- 同じユーザーに対して一貫した
externalUserIdを使用していることを確認します。 - ユーザー ID が埋め込み URL 内で正しく渡されていることを確認します。
次のステップ
- iFrame と Apps の埋め込み: 埋め込みに関する完全なドキュメントを参照する
- ライセンス: 匿名ユーザーの消費量を把握する
- 概要
- 前提条件
- 手順 1: 外部アプリケーションを作成する
- 手順 2: 外部アプリケーションの権限を設定する
- テナント レベルのアクセス権を割り当てる
- フォルダー レベルのアクセス権を割り当てる
- 手順 3: トークン エンドポイントを作成する
- 推奨アーキテクチャ
- セキュリティに関する考慮事項
- 実装例
- 環境変数
- 許可されたオリジンを設定する
- 手順 4: 匿名アクセスを持つエージェントを埋め込む
- 匿名アクセス URL パラメーター
- 埋め込み URL の例
- HTML の例
- トラブルシューティング
- トークン エンドポイントが 403 を返す
- トークン要求が認証エラーで失敗する
- エージェントがリソースにアクセスできない
- チャット履歴が保持されない
- 次のステップ