The flow can be invoked from a user-facing process. Here are the parameters:

- `/services/auth/xds/{org_id}/{authprovider_developer_name}` - this issues the logout,
- `&startURL=/0XA...` - this ID tells SF which Named Credential to link the grant against,
- `&scope=full...` - list of scopes/privileges presented to the user at the Allow screen,

Apex code to return such a URL from a VF page action or button:

    public PageReference authorizeNamedCredential(String authProvider, String namedCredential)
    {
        AuthProvider provider = [
            SELECT Id
            FROM AuthProvider
            WHERE DeveloperName = :authProvider
        ];
        
        NamedCredential credential = [
            SELECT Id
            FROM NamedCredential
            WHERE DeveloperName = :namedCredential
        ];
        
        String oid = UserInfo.getOrganizationId();
        String domain = Url.getOrgDomainUrl().toExternalForm();
        String path = '/services/auth/xds/' + oid + '/' + authProvider;
        String startUrl = '/' + String.valueOf(credential.Id).left(15);
        
        PageReference redirect = new PageReference(domain + path);
        redirect.getParameters().put('startURL', startUrl);
        redirect.getParameters().put('scope', 'full refresh_token');
        return redirect;
    }

After logging back in, the user must manually click Allow:

[![named credential grant][1]][1]

Technically it's possible to skip the manual authorization nag by pre-authorizing the app on a Profile or Permission Set. But the pre-authorization step is itself a manual process!

- Deploy the Connected App into the org per your Metadata API
- Go to Setup > Connected Apps > Manage Apps > Edit Policies
- Change "Permitted Users" to "Admin approved users are pre-authorized" then save
- Edit the Profiles or Permission Sets then navigate to Connected App Access
- Enable the app, then save.



  [1]: https://i.sstatic.net/o2gVc.png