in modules/oauth/mod-oauth2.cpp [182:225]
const failable<int> authorize(const list<value>& args, request_rec* const r, const list<value>& appkeys) {
// Extract authorize, access_token, client ID and info URIs
const list<value> ref = assoc<value>("openauth_referrer", args);
if (isNull(ref) || isNull(cdr(ref)))
return mkfailure<int>("Missing openauth_referrer parameter");
const list<value> auth = assoc<value>("oauth2_authorize", args);
if (isNull(auth) || isNull(cdr(auth)))
return mkfailure<int>("Missing oauth2_authorize parameter");
const list<value> tok = assoc<value>("oauth2_access_token", args);
if (isNull(tok) || isNull(cdr(tok)))
return mkfailure<int>("Missing oauth2_access_token parameter");
const list<value> cid = assoc<value>("oauth2_client_id", args);
if (isNull(cid) || isNull(cdr(cid)))
return mkfailure<int>("Missing oauth2_client_id parameter");
const list<value> info = assoc<value>("oauth2_info", args);
if (isNull(info) || isNull(cdr(info)))
return mkfailure<int>("Missing oauth2_info parameter");
const list<value> scope = assoc<value>("oauth2_scope", args);
if (isNull(scope) || isNull(cdr(scope)))
return mkfailure<int>("Missing oauth2_scope parameter");
const list<value> display = assoc<value>("oauth2_display", args);
// Build the redirect URI
const string redir = httpd::url("/oauth2/access_token/", r);
debug(redir, "modoauth2::authorize::redir");
// Build the state URI
const list<value> stargs = mklist<value>(tok, cid, info, ref);
const string state = http::queryString(stargs);
debug(state, "modoauth2::authorize::state");
// Lookup client app configuration
const list<value> app = assoc<value>(cadr(cid), appkeys);
if (isNull(app) || isNull(cdr(app)))
return mkfailure<int>(string("client id not found: ") + (string)cadr(cid));
list<value> appkey = cadr(app);
// Redirect to the authorize URI
const list<value> adisplay = (isNull(display) || isNull(cdr(display)))? nilListValue : mklist<value>("display", cadr(display));
const list<value> aargs = mklist<value>(mklist<value>("response_type", "code"), mklist<value>("client_id", car(appkey)), mklist<value>("scope", cadr(scope)), adisplay, mklist<value>("redirect_uri", httpd::escape(redir)), mklist<value>("state", httpd::escape(state)));
const string uri = httpd::unescape(cadr(auth)) + string("?") + http::queryString(aargs);
debug(uri, "modoauth2::authorize::uri");
return httpd::externalRedirect(uri, r);
}