It is common to use XMPP user accounts for identity. Many features for user accounts have been proposed (for example, Personal Eventing Protocol (XEP-0163) [4]). Organizations such as Buddycloud and Livefyre have recognized the need to be able to offer features to existing standard XMPP accounts by offering proprietary service delegation mechanisms. This specification proposes a Standards Track solution for discovering external services associated with XMPP user identities.
To learn of delegate services for a user, query the bare JID of the user:
<iq type="get" from="[email protected]/home" to="[email protected]" id="d1"> <query xmlns="urn:xmpp:tmp:delegate"/> </iq>
<iq type="result" from="[email protected]" to="[email protected]/home" id="d1"> <query xmlns="urn:xmpp:tmp:delegate"> <service type="pubsub" jid="pubsub.example.net"/> <service type="chess" jid="[email protected]"/> </query> </iq>
In the above example, we learn that "chess" related communication should go through the "[email protected]" JID rather than the user's own JID ("[email protected]").
As it is expected that most servers will not even support the ability to query user accounts for delegate services, it should be possible to contact a third-party or global registry holding the same information, to be queried in much the same way:
<iq type="get" from="[email protected]/home" to="registry.example.com" id="r1"> <query xmlns="urn:xmpp:tmp:delegate" jid="[email protected]"/> </iq>
<iq type="result" from="registry.example.com" to="[email protected]/home" id="r1"> <query xmlns="urn:xmpp:tmp:delegate"> <service type="pubsub" jid="pubsub.example.net"/> <service type="chess" jid="[email protected]"/> </query> </iq>
Here's how a user adds a mapping to the registry:
<iq type="set" from="[email protected]/home" to="registry.example.com" id="r2"> <query xmlns="urn:xmpp:tmp:delegate"> <service type="chess" jid="[email protected]"/> </query> </iq>
<iq type="result" from="registry.example.com" to="[email protected]/home" id="r2"/>
The registry will add the new service to the list of mapped services for the sender JID.
To remove a service from the list, submit without a jid attribute:
<iq type="set" from="[email protected]/home" to="registry.example.com" id="r3"> <query xmlns="urn:xmpp:tmp:delegate"> <service type="chess"/> </query> </iq>
<iq type="result" from="registry.example.com" to="[email protected]/home" id="r3"/>
Whether a delegate JID is discovered directly or via registry, the mapping is an assertion made by the user only and not by the delegate. This may have security implications. For example, a third party should not allow the user to pose as the delegate, nor should the mapping be considered an endorsement by the delegate, since anyone can assert any delegate. However, these types of things could be allowed if third parties confirm with the delegate that the association exists.
Here's how to query a delegate JID to confirm if it is indeed associated with a specific user for a specific service type:
<iq type="get" from="[email protected]/home" to="[email protected]" id="c1"> <check xmlns="urn:xmpp:tmp:delegate" type="chess" jid="[email protected]"/> </iq>
Note that the user JID expected to be associated with the delegate must be provided in the request. It is not possible to query a delegate to determine the user JID, since a single delegate may act for many users.
Success response means the association exists:
<iq type="result" from="[email protected]" to="[email protected]/home" id="c1"/>
Applications that are configured to use a third-party registry SHOULD still be able to query user accounts directly. For performance reasons, it is recommended to query both the user account and the registry simultaneously, and take whichever answer arrives first. If one of the queries results in an error, then the application should wait for the other query to complete before assuming no such delegate records exists.
If both queries return errors, or a success result does not contain an entry for some desired delegate service, it can be assumed that the desired service is provided by the user account itself (not delegated).
It is RECOMMENDED that discovery or confirmation of delegate information be cached indefinitely and refreshed no more frequently than every 24 hours. Data refreshing should not block access to existing information. If over 24 hours pass since the last time delegate information was needed, the application should continue to use the old data while independently firing off a task to refresh the data. This way, latency associated with a particular user delegation only occurs the first time a user is ever seen.
As discussed above, a delegate mapping is an assertion by the user only. If the user should be allowed to act for the delegate, or if the user should be considered endorsed by the delegate, then the delegation needs to be confirmed first.
No interaction with the Internet Assigned Numbers Authority (IANA) [5] is required as a result of this document.
This specification defines the following XML namespace:
Upon advancement of this specification from a status of Experimental to a status of Draft, the XMPP Registrar Function (XEP-0053) [7].
If the protocol defined in this specification undergoes a revision that is not fully backwards-compatible with an older version, the XMPP Registrar shall increment the protocol version number found at the end of the XML namespaces defined herein, as described in Section 4 of XEP-0053.
This document in other formats: XML CC-BY-SA 2.0 license.
The Extensible Messaging and Presence Protocol (XMPP) is defined in the XMPP Core (RFC 6120) and XMPP IM (RFC 6121) specifications contributed by the XMPP Standards Foundation to the Internet Standards Process, which is managed by the Internet Engineering Task Force in accordance with RFC 2026. Any protocol defined in this document has been developed outside the Internet Standards Process and is to be understood as an extension to XMPP rather than as an evolution, development, or modification of XMPP itself.
The primary venue for discussion of XMPP Extension Protocols is the <https://xmpp.org/extensions/xep-0084.html>.
2. XEP-0277: Microblogging over XMPP <https://xmpp.org/registrar/>.
7. XEP-0053: XMPP Registrar Function <0.0.1 (2010-01-05)¶
First draft.
@report{karneges2010xep0291, title = {Service Delegation}, author = {Karneges, Justin}, type = {XEP}, number = {0291}, version = {0.1}, institution = {XMPP Standards Foundation}, url = {https://xmpp.org/extensions/xep-0291.html}, date = {2010-01-05/2011-01-26}, }
END