以前は、Auth0 ではアクセストークンとIDトークンでは名前空間付きのクレームのみが許可されていました。カスタムクレームへの移行により、、IDトークン、および Auth0 の Authentication API の /userinfo エンドポイントで、名前空間のないクレームも使用できるようになりました。
// Auth0 Action exports.onExecutePostLogin = async (event, api) => { // 公開名前空間付きカスタムクレーム api.accessToken.setCustomClaim('https://myDomain.com/myClaim', 'this is a public, namespaced claim'); api.idToken.setCustomClaim('https://myDomain.com/myClaim', 'this is a public, namespaced claim'); // 名前空間なしのカスタムクレーム api.accessToken.setCustomClaim('myClaim', 'this is a private, non namespaced claim'); api.idToken.setCustomClaim('myClaim', 'this is a private, non namespaced claim');};
// Auth0 Action exports.onExecutePostLogin = async (event, api) => { // これは無視される api.accessToken.setCustomClaim('roles', 'this is a role, but Auth0 will ignore it'); // これは成功し、トークンに表示される api.idToken.setCustomClaim('https://myDomain.com/roles', 'this is a role');};
Auth0 では、 が Auth0 API であるアクセストークンについて、非公開かつ名前空間なしのカスタムクレームの作成が制限されます。オーディエンスが Auth0 API であるアクセストークンに対して、非公開かつ名前空間なしのカスタムクレームを設定しようとしても、その試みは無視されます。トランザクション自体は失敗しませんが、そのクレームはトークンに追加されません。Auth0 では、Auth0 の API で使用されるトークンにカスタムクレームを設定しないことを推奨しています。
// Auth0 Action exports.onExecutePostLogin = async (event, api) => { // オーディエンスがAuth0のオーディエンスの場合、これらは無視されます api.accessToken.setCustomClaim('myATclaim', 'this is a claim'); api.accessToken.setCustomClaim('https://myDomain.com/myATclaim', 'this is a claim'); // これらは成功します。オーディエンスの制限を受けないためです api.idToken.setCustomClaim('myIdTclaim', 'this is a claim'); api.idToken.setCustomClaim('https://myDomain.com/myIdTclaim', 'this is a claim');};
以下の例は、オーディエンスが Auth0 API ではない場合に返される、カスタムクレームを含むレスポンスを示しています。
-- Resource Owner Password Flow POST https://{yourTenant}.auth0.com/oauth/tokengrant_type:passwordusername:***password:***client_id:***client_secret:***audience:https://{yourApi}.com -- オーディエンスに注意。これはカスタムAPIですscope:openid profile
以下の例は、Auth0 API のオーディエンスを追加していない場合に返される、カスタムクレームを含むレスポンスを示しています。
// Auth0 Action exports.onExecutePostLogin = async (event, api) => { // これらはいずれもトークンにも /userinfo レスポンスにも追加されない api.idToken.setCustomClaim('https://example.auth0.com', 'this is a claim'); api.idToken.setCustomClaim('https://example.webtask.io', 'this is a claim'); api.idToken.setCustomClaim('https://example.webtask.run', 'this is a claim');};
// Auth0 Rulefunction (user, context, callback) { user.app_metadata.a_claim = 'This is a claim'; user.app_metadata.another_claim = 'This is a another claim'; context.samlConfiguration = context.samlConfiguration || {}; context.samlConfiguration.mappings = { "a_claim": "app_metadata.a_claim", "another_claim": "app_metadata.another_claim" }; context.idToken.app_metadata = {}; return callback(null, user, context);}
この移行前の SAML レスポンス:
<samlp:Response> (...) <saml:Assertion> (...) <saml:AttributeStatement xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <saml:Attribute Name="a_claim" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"> <saml:AttributeValue xsi:type="xs:string"> This is a claim </saml:AttributeValue> </saml:Attribute> <saml:Attribute Name="another_claim" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"> <saml:AttributeValue xsi:type="xs:string"> This is a another claim </saml:AttributeValue> </saml:Attribute> </saml:AttributeStatement> </saml:Assertion></samlp:Response>
// Auth0 Rulefunction (user, context, callback) { user.app_metadata.a_claim = 'This is a claim'; user.app_metadata.another_claim = 'This is a another claim'; context.samlConfiguration = context.samlConfiguration || {}; context.samlConfiguration.mappings = { "a_claim": "app_metadata.a_claim", "another_claim": "app_metadata.another_claim", "claim_set_via_id_token": "app_metadata.claim_set_via_id_token" }; context.idToken.app_metadata = { claim_set_via_id_token: "This is a claim which was set via context.idToken" }; return callback(null, user, context);}
移行前の SAML レスポンス:
<samlp:Response> (...) <saml:Assertion> (...) <saml:AttributeStatement xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <saml:Attribute Name="a_claim"> <saml:AttributeValue xsi:type="xs:anyType"> This is a claim </saml:AttributeValue> </saml:Attribute> <saml:Attribute Name="another_claim"> <saml:AttributeValue xsi:type="xs:anyType"> This is a another claim </saml:AttributeValue> </saml:Attribute> <saml:Attribute Name="claim_set_via_id_token"> <saml:AttributeValue xsi:type="xs:anyType"> This is a claim which was set via context.idToken </saml:AttributeValue> </saml:Attribute> </saml:AttributeStatement> </saml:Assertion></samlp:Response>
アップグレード後の動作でのSAMLレスポンス:
<samlp:Response> (...) <saml:Assertion> (...) <saml:AttributeStatement xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <saml:Attribute Name="claim_set_via_id_token" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"> <saml:AttributeValue xsi:type="xs:string"> This is a claim which was set via context.idToken </saml:AttributeValue> </saml:Attribute> </saml:AttributeStatement> </saml:Assertion></samlp:Response>
if (!['samlp', 'wsfed'].includes(context.protocol)) { context.idToken.app_metadata = { claim_set_via_id_token: "This is a claim which was set via context.idToken" };}