Bug 1048530 - Create a Loop test server for exchanging an OAuth code for a token. r=vladikoff,ckarlof,mikedeboer

This commit is contained in:
Matthew Noorenberghe 2014-08-15 16:52:05 -07:00
Родитель 31975c6dab
Коммит 4895838127
2 изменённых файлов: 89 добавлений и 1 удалений

Просмотреть файл

@ -55,6 +55,41 @@ add_task(function* delete_setup_params() {
is(Object.keys(request.response).length, 0, "Params should have been deleted"); is(Object.keys(request.response).length, 0, "Params should have been deleted");
}); });
// Begin /fxa-oauth/token tests
add_task(function* token_request() {
let params = {
client_id: "my_client_id",
content_uri: "https://example.com/content/",
oauth_uri: "https://example.com/oauth/",
profile_uri: "https://example.com/profile/",
state: "my_state",
};
yield promiseOAuthParamsSetup(BASE_URL, params);
let request = yield promiseToken("my_code", params.state);
ise(request.status, 200, "Check token response status");
ise(request.response.access_token, "my_code_access_token", "Check access_token");
ise(request.response.scopes, "", "Check scopes");
ise(request.response.token_type, "bearer", "Check token_type");
});
add_task(function* token_request_invalid_state() {
let params = {
client_id: "my_client_id",
content_uri: "https://example.com/content/",
oauth_uri: "https://example.com/oauth/",
profile_uri: "https://example.com/profile/",
state: "my_invalid_state",
};
yield promiseOAuthParamsSetup(BASE_URL, params);
let request = yield promiseToken("my_code", "my_state");
ise(request.status, 400, "Check token response status");
ise(request.response, null, "Check token response body");
});
// Helper methods
function promiseParams() { function promiseParams() {
let deferred = Promise.defer(); let deferred = Promise.defer();
let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]. let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
@ -65,8 +100,28 @@ function promiseParams() {
info("/fxa-oauth/params response:\n" + JSON.stringify(xhr.response, null, 4)); info("/fxa-oauth/params response:\n" + JSON.stringify(xhr.response, null, 4));
deferred.resolve(xhr); deferred.resolve(xhr);
}); });
xhr.addEventListener("error", error => deferred.reject(error)); xhr.addEventListener("error", deferred.reject);
xhr.send(); xhr.send();
return deferred.promise; return deferred.promise;
} }
function promiseToken(code, state) {
let deferred = Promise.defer();
let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
createInstance(Ci.nsIXMLHttpRequest);
xhr.open("POST", BASE_URL + "/fxa-oauth/token", true);
xhr.responseType = "json";
xhr.addEventListener("load", () => {
info("/fxa-oauth/token response:\n" + JSON.stringify(xhr.response, null, 4));
deferred.resolve(xhr);
});
xhr.addEventListener("error", deferred.reject);
let payload = {
code: code,
state: state,
};
xhr.send(JSON.stringify(payload, null, 4));
return deferred.promise;
}

Просмотреть файл

@ -9,6 +9,8 @@
const REQUIRED_PARAMS = ["client_id", "content_uri", "oauth_uri", "profile_uri", "state"]; const REQUIRED_PARAMS = ["client_id", "content_uri", "oauth_uri", "profile_uri", "state"];
Components.utils.import("resource://gre/modules/NetUtil.jsm");
/** /**
* Entry point for HTTP requests. * Entry point for HTTP requests.
*/ */
@ -20,6 +22,9 @@ function handleRequest(request, response) {
case "/fxa-oauth/params": case "/fxa-oauth/params":
params(request, response); params(request, response);
return; return;
case "/fxa-oauth/token":
token(request, response);
return;
} }
response.setStatusLine(request.httpVersion, 404, "Not Found"); response.setStatusLine(request.httpVersion, 404, "Not Found");
} }
@ -83,3 +88,31 @@ function params(request, response) {
response.setHeader("Content-Type", "application/json; charset=utf-8", false); response.setHeader("Content-Type", "application/json; charset=utf-8", false);
response.write(JSON.stringify(params, null, 2)); response.write(JSON.stringify(params, null, 2));
} }
/**
* POST /fxa-oauth/token
*
* Validate the state parameter with the server session state and if it matches, exchange the code
* for an OAuth Token.
* Parameters: code & state as JSON in the POST body.
* Response: JSON containing an object of OAuth token information.
*/
function token(request, response) {
let params = JSON.parse(getSharedState("/fxa-oauth/params") || "{}");
let body = NetUtil.readInputStreamToString(request.bodyInputStream,
request.bodyInputStream.available());
let payload = JSON.parse(body);
if (!params.state || params.state !== payload.state) {
response.setStatusLine(request.httpVersion, 400, "State mismatch");
response.write("State mismatch");
return;
}
let tokenData = {
access_token: payload.code + "_access_token",
scopes: "",
token_type: "bearer",
};
response.setHeader("Content-Type", "application/json; charset=utf-8", false);
response.write(JSON.stringify(tokenData, null, 2));
}