Overview#Custom URI scheme is URI scheme (as defined by RFC 3986) that a native application creates and registers with the OS (and is not a standard URI scheme like "https:" or "tel:").
Requests to such a scheme results in the app which registered it being launched by the OS. For example, "myapp:", "com.example.myapp:" are both Custom URI schemes.
In particular, the Custom URI scheme pattern is supported on the mobile platforms:
Desktop operating systems also support Custom URI scheme:
To avoid clashing with existing schemes in use, using a scheme that follows the reverse domain name notation pattern applied to a domain under the app publishers control is RECOMMENDED. Such a scheme can be based on a domain they control, or the OAuth client identifier in cases where the authorization Server issues client identifiers that are also valid DNS subdomains. The chosen scheme MUST NOT clash with any IANA registered scheme. You SHOULD also ensure that no other app by the same publisher uses the same scheme.
Schemes using reverse domain name notation are hardened against collision. They are unlikely to clash with an officially IANA registered scheme or unregistered de-facto scheme, as these generally don't include a period character, and are unlikely to match your domain name in any case. They are guaranteed not to clash with any OAuth client following these naming guidelines in full.
Some platforms use globally unique bundle or package names that follow the reverse domain name notation pattern. In these cases, the app SHOULD register that bundle id as the custom scheme. If an app has a bundle id or package name that doesn't match a domain name under the control of the app, the app SHOULD NOT register that as a scheme, and instead create a URI scheme based off one of their domain names.
For example, an app whose publisher owns the top level domain name "example.com" can register "com.example.app:/" as their custom scheme. An app whose authorization server issues client identifiers that are also valid domain names, for example "client1234.usercontent.idp.com", can use the reverse domain name notation of that domain as the scheme, i.e. "com.idp.usercontent.client1234:/". Each of these examples are URI schemes which are likely to be unique, and where the publisher can assert ownership.
As a counter-example, using a simple custom scheme like "myapp:/" is not guaranteed to be unique and is NOT RECOMMENDED.
In addition to uniqueness, basing the URI scheme off a name that is under the control of the app's publisher can help to prove ownership in the event of a dispute where two apps register the same custom scheme (such as if an app is acting maliciously). For example, if two apps registered "com.example.app:", the true owner of "example.com" could petition the app store operator to remove the counterfeit app. This petition is harder to prove if a generic URI scheme was chosen.
Custom scheme redirects are not real useful!#John Bradley on the OAuth 2.0 mailing list:
Getting a trusted [AS|Authorization Server] to say you are Tripit or some trusted client when you are really a bad guy is becoming a real problem. This is however not directly connected to the client mix up issue, and needs to be addressed separately. One thing we added to dynamic client registration was a software statement that can lock down redirect URI for a given client. In the case of Mobile Connect for Mobile network operators the proposal is to have a trusted registration authority that validates clients and issues them software statements to register at individual AS. Validating the developer/client will probably need to be a business process, more stringent than just getting a developer account based on an email address. One possibility might be to check if the redirect URI has a EV certificate indicating the organization, or trust frameworks set up to register clients for conformance with European data protection laws (yes with safe harbour going away something like that might be required by AS to keep on the good side of the law. Germany did take a run at this once, but it did not work for the internet in a practical way) The biggest issue will probably be identifying native apps. Custom scheme redirects are not real useful. On iOS and Android(beta) there are now ways for an app to claim a https: URI that is controlled by the developer. https://tools.ietf.org/html/draft-ietf-oauth-native-apps-00#page-9 That in combination with software statements might be a useful way to identify the client and display something useful at the AS. We need to do more work on this in my opinion. John B.