Auth0 Rules を使用すると、メタデータの読み取り、更新、削除を行えます。以降のセクションでは、ユーザーとその情報を次の JSON スニペットで表した例を使用します。
{
"user_id": "jdoe",
"email": "john.doe@example.com",
"app_metadata": {
"roles": [ "writer" ]
},
"user_metadata": {
"preferences": {
"color": "blue"
}
}
}
を Rules と組み合わせて使用すると、メタデータを読み取れます。また、user_metadata で次のようなプロファイル関連情報を検索することもできます。
name
nickname
given_name
family_name
デフォルトでは、Auth0 以外の (Google、Facebook、X など) から提供されるユーザープロファイル属性は、ユーザーがログインするたびに IDプロバイダーから更新されるため、直接編集できません。IDプロバイダー由来の属性の詳細については、ユーザープロファイル更新用の IDプロバイダー接続を構成する を参照してください。
Normalized User Profile の name、nickname、given_name、family_name、または picture のルート属性を編集できるようにするには、接続の Auth0 との同期を構成 して、ユーザー属性がユーザープロファイルの作成時にのみ IDプロバイダーから更新されるようにする必要があります。これにより、これらのルート属性を個別に、または一括インポートで編集できるようになります。
例として、メールアドレス jane.doe@example.com を持つユーザーに次のメタデータが保存されているとします。
{
"email": "jane.doe@example.com",
"user_metadata": {
"hobby": "surfing"
},
"app_metadata": {
"plan": "full"
}
}
上記のメタデータ例を使用すると、次のように、Auth0 Rules または Management API の呼び出しでデータセット内の特定の項目を参照できます。
console.log(user.email); // "jane.doe@example.com"
console.log(user.user_metadata.hobby); // "surfing"
console.log(user.app_metadata.plan); // "full"
有効な JSON スニペットであれば、どれでもメタデータとして使用できます。ただし、user.app_metadata はデフォルトで Undefined である点に注意してください。
使用可能なメタデータを読み取るには、適切なユーザー プロパティにアクセスする必要があります。
ユーザーのロールに基づいて判断できます。
function(user, context, callback){
user.app_metadata = user.app_metadata || {};
if (user.app_metadata.roles.indexOf('writer')){
// 実行するコード
}
...
}
色の好みなど、特定の設定に基づいて判断できます。
function(user, context, callback){
user.user_metadata = user.user_metadata || {};
if (user.user_metadata.preferences.color === 'black'){
// 実行するコード
}
...
}
アプリケーションメタデータ (clientMetadata) は、context オブジェクトの省略可能なトップレベルプロパティです。既存のアプリケーションでは、このプロパティの値は設定されていません。
function(user, context, callback){
context.clientMetadata = context.clientMetadata || {};
if (context.clientMetadata.usersuppliedkey1 === 'black'){
// このコードはユーザーに対して実行されません
}
...
}
Rules を使用して、Auth0 が IdP から受信した SAML 属性を user_metadata または app_metadata にマッピングします。
ユーザーに管理者ロールを追加するには:
function(user, context, callback){
user.app_metadata = user.app_metadata || {};
// レスポンスに含まれるapp_metadataを更新する
user.app_metadata.roles = user.app_metadata.roles || [];
user.app_metadata.roles.push('administrator');
// app_metadataの更新を永続化する
auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
.then(function(){
callback(null, user, context);
})
.catch(function(err){
callback(err);
});
}
これにより、ユーザープロフィールの詳細は次のような JSON 表現になります。
{
"user_id": "jdoe",
"email": "john.doe@example.com",
"app_metadata": {
"roles": [ "writer", "administrator" ]
},
"user_metadata": {
"preferences": {
"color": "blue"
}
}
}
ユーザーの fontSize 設定をユーザープロフィールに追加するには、
function(user, context, callback){
user.user_metadata = user.user_metadata || {};
// レスポンスに含まれる user_metadata を更新する
user.user_metadata.preferences = user.user_metadata.preferences || {};
user.user_metadata.preferences.fontSize = 12;
// user_metadata の更新を永続化する
auth0.users.updateUserMetadata(user.user_id, user.user_metadata)
.then(function(){
callback(null, user, context);
})
.catch(function(err){
callback(err);
});
}
これにより、ユーザープロフィールの詳細は次のような JSON 表現になります。
{
"user_id": "jdoe",
"email": "john.doe@example.com",
"app_metadata": {
"roles": [ "writer" ]
},
"user_metadata": {
"preferences": {
"color": "blue",
"fontSize": 12
}
}
}
Rule の処理時間を短縮するには、同じ Rule 内で app_metadata と user_metadata の両方を更新できます。
function(user, context, callback){
var q = require('q');
user.app_metadata = user.app_metadata || {};
user.user_metadata = user.user_metadata || {};
// レスポンスに含まれる user_metadata を更新する
user.user_metadata.preferences = user.user_metadata.preferences || {};
user.user_metadata.preferences.fontSize = 12;
// レスポンスに含まれる app_metadata を更新する
user.app_metadata.roles = user.app_metadata.roles || [];
user.app_metadata.roles.push('admin');
// app_metadata の更新を永続化する
var appMetadataPromise = auth0.users.updateAppMetadata(user.user_id, user.app_metadata);
// user_metadata の更新を永続化する
var userMetadataPromise = auth0.users.updateUserMetadata(user.user_id, user.user_metadata);
// q ライブラリを使用してすべての Promise の完了を待機する
q.all([userMetadataPromise, appMetadataPromise])
.then(function(){
callback(null, user, context);
})
.catch(function(err){
callback(err);
});
}
これにより、ユーザープロフィールの詳細は次のような JSON 表現になります:
{
"user_id": "jdoe",
"email": "john.doe@example.com",
"app_metadata": {
"roles": [ "writer", "admin" ]
},
"user_metadata": {
"preferences": {
"color": "blue",
"fontSize": 12
}
}
}
プロパティを削除するには、対象のプロパティの値を null に設定します。
ユーザーのロールを削除するには、次のサンプルのRuleを使用します。
function(user, context, callback){
user.app_metadata = user.app_metadata || {};
// レスポンスに含まれる app_metadata を更新する
user.app_metadata.roles = null;
// app_metadata の更新を永続化する
auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
.then(function(){
callback(null, user, context);
})
.catch(function(err){
callback(err);
});
}
これにより、ユーザープロフィールは次の JSON 表現になります。
{
"user_id": "jdoe",
"email": "john.doe@example.com",
"app_metadata": { },
"user_metadata": {
"preferences": {
"color": "blue"
}
}
}
プロパティの値を 1 つだけ削除するには、その値を削除します。たとえば、ユーザープロフィールから writer ロールを削除するには:
function(user, context, callback){
user.app_metadata = user.app_metadata || {};
user.app_metadata.roles = user.app_metadata.roles || [];
var index = user.app_metadata.roles.indexOf('writer');
if (index !== -1){
// レスポンスに含まれるapp_metadataを更新する
user.app_metadata.roles.splice(index, 1);
}
// app_metadataの更新を永続化する
auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
.then(function(){
callback(null, user, context);
})
.catch(function(err){
callback(err);
});
}
その結果、ユーザープロフィールは次のような JSON 表現になります:
{
"user_id": "google-oauth2|1234",
"email": "john.doe@gmail.com",
"app_metadata": {
"roles": [ ]
},
"user_metadata": {
"preferences": {
"color": "blue"
}
}
}
roles プロパティは引き続き存在しますが、値は含まれていないことに注意してください。
ユーザーの色設定を削除するには:
function(user, context, callback){
user.user_metadata = user.user_metadata || {};
// レスポンスに含まれる user_metadata を更新する
user.user_metadata.preferences = user.user_metadata.preferences || {};
delete user.user_metadata.preferences.color;
// user_metadata の更新を永続化する
auth0.users.updateUserMetadata(user.user_id, user.user_metadata)
.then(function(){
callback(null, user, context);
})
.catch(function(err){
callback(err);
});
}
これにより、ユーザープロフィールの詳細は次のような JSON 表現になります。
{
"user_id": "jdoe",
"email": "john.doe@example.com",
"app_metadata": {
"roles": [ "writer" ]
},
"user_metadata": {
"preferences": { }
}
}