features.shindig.auth.auth.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of shindig-features Show documentation
Show all versions of shindig-features Show documentation
Packages all the features that shindig provides into a single jar file to allow
loading from the classpath
The newest version!
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*global gadgets */
/**
* @fileoverview
*
* Manages the gadget security token AKA the gadget auth token AKA the
* social token. Also provides an API for the container server to
* efficiently pass authenticated data to the gadget at render time.
*
* The shindig.auth package is not part of the opensocial or gadgets spec,
* and gadget authors should never use these functions or the security token
* directly. These APIs are an implementation detail and are for shindig
* internal use only.
*
* Passing authenticated data into the gadget at render time:
*
* The gadget auth token is the only way for the container to allow the
* gadget access to authenticated data. gadgets.io.makeRequest for SIGNED
* or OAUTH requests relies on the authentication token. Access to social data
* also relies on the authentication token.
*
* The authentication token is normally passed into the gadget on the URL
* fragment (after the #), and so is not visible to the gadget rendering
* server. This keeps the token from being leaked in referer headers, but at
* the same time limits the amount of authenticated data the gadget can view
* quickly: fetching authenticated data requires an extra round trip.
*
* If the authentication token is passed to the gadget as a query parameter,
* the gadget rendering server gets an opportunity to view the token during
* the rendering process. This allows the rendering server to quickly inject
* authenticated data into the gadget, at the price of potentially leaking
* the authentication token in referer headers. That risk can be mitigated
* by using a short-lived authentication token on the query string, which
* the gadget server can swap for a longer lived token at render time.
*
* If the rendering server injects authenticated data into the gadget in the
* form of a JSON string, the resulting javascript object can be accessed via
* shindig.auth.getTrustedData.
*
* To access the security token:
* var st = shindig.auth.getSecurityToken();
*
* To update the security token with new data from the gadget server:
* shindig.auth.updateSecurityToken(newToken);
*
* To quickly access a javascript object that has been authenticated by the
* container and the rendering server:
* var trusted = shindig.auth.getTrustedData();
* doSomething(trusted.foo.bar);
*/
/**
* Class used to mange the gadget auth token. Singleton initialized from
* auth-init.js.
*
* @constructor
*/
shindig.Auth = function() {
/**
* The authentication token.
*/
var authToken = null;
/**
* Trusted object from container.
*/
var trusted = null;
/**
* Copy URL parameters into the auth token
*
* The initial auth token can look like this:
* t=abcd&url=$&foo=
*
* If any of the values in the token are '$', a matching parameter
* from the URL will be inserted, for example:
* t=abcd&url=http%3A%2F%2Fsome.gadget.com&foo=
*
* Why do this at all? The only currently known use case for this is
* efficiently including the gadget URL in the auth token. If you embed
* the entire URL in the security token, you effectively double the size
* of the URL passed on the gadget rendering request:
* /gadgets/ifr?url=#st=
*
* This can push the gadget render URL beyond the max length supported
* by browsers, and then things break. To work around this, the
* security token can include only a (much shorter) hash of the gadget-url:
* /gadgets/ifr?url=#st=
*
* However, we still want the proxy that handles gadgets.io.makeRequest
* to be able to look up the gadget URL efficiently, without requring
* a database hit. To do that, we modify the auth token here to fill
* in any blank values. The auth token then becomes:
* t=&url=
*
* We send the expanded auth token in the body of post requests, so we
* don't run into problems with length there. (But people who put
* several hundred characters in their gadget URLs are still lame.)
* @param {Object} urlParams
*/
function addParamsToToken(urlParams) {
var args = authToken.split('&');
for (var i = 0; i < args.length; i++) {
var nameAndValue = args[i].split('=');
if (nameAndValue.length === 2) {
var name = nameAndValue[0];
var value = nameAndValue[1];
if (value === '$') {
value = encodeURIComponent(urlParams[name]);
args[i] = name + '=' + value;
}
}
}
authToken = args.join('&');
}
function init (configuration) {
var urlParams = gadgets.util.getUrlParameters();
var config = configuration["shindig.auth"] || {};
// Auth token - might be injected into the gadget directly, or might
// be on the URL (hopefully on the fragment).
if (config.authToken) {
authToken = config.authToken;
} else if (urlParams.st) {
authToken = urlParams.st;
}
if (authToken !== null) {
addParamsToToken(urlParams);
}
// Trusted JSON. We use eval directly because this was injected by the
// container server and json parsing is slow in IE.
if (config.trustedJson) {
trusted = eval("(" + config.trustedJson + ")");
}
}
gadgets.config.register("shindig.auth", null, init);
return /** @scope shindig.auth */ {
/**
* Gets the auth token.
*
* @return {string} the gadget authentication token
*
* @member shindig.auth
*/
getSecurityToken : function() {
return authToken;
},
/**
* Updates the security token with new data from the gadget server.
*
* @param {string} newToken the new auth token data.
*
* @member shindig.auth
*/
updateSecurityToken : function(newToken) {
authToken = newToken;
},
/**
* Quickly retrieves data that is known to have been injected by
* a trusted container server.
* @return {Object}
*/
getTrustedData : function() {
return trusted;
}
};
};
© 2015 - 2024 Weber Informatics LLC | Privacy Policy