123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- ;(function($, navigator, window_location) {
- 'use strict';
- // Public API
- var django_browserid = {
- /**
- * Retrieve an assertion and use it to log the user into your site.
- * @param {object} requestArgs Options to pass to navigator.id.request.
- * @param {string} next URL to redirect the user to if login is
- * successful.
- * @return {jQuery.Deferred} Deferred that resolves once the user has
- * been logged in.
- */
- login: function login(requestArgs, next) {
- if (typeof requestArgs === 'string') {
- next = requestArgs;
- requestArgs = undefined;
- }
- return django_browserid.getAssertion(requestArgs).then(function(assertion) {
- return django_browserid.verifyAssertion(assertion, next);
- });
- },
- /**
- * Log the user out of your site.
- * @param {string} next URL to redirect the user to if logout is
- * successful.
- * @return {jQuery.Deferred} Deferred that resolves once the user has
- * been logged out.
- */
- logout: function logout(next) {
- var info = this.getInfo();
- return this.getCsrfToken().then(function(csrfToken) {
- return $.ajax(info.logoutUrl, {
- type: 'POST',
- data: {next: next},
- headers: {'X-CSRFToken': csrfToken},
- });
- });
- },
- /**
- * Retrieve an assertion via BrowserID.
- * @param {object} requestArgs Options to pass to navigator.id.request.
- * @return {jQuery.Deferred} Deferred that resolves with the assertion
- * once it is retrieved.
- */
- getAssertion: function getAssertion(requestArgs) {
- requestArgs = $.extend({}, this.getInfo().requestArgs, requestArgs);
- this._requestDeferred = $.Deferred();
- navigator.id.request(requestArgs);
- return this._requestDeferred;
- },
- /**
- * Verify that the given assertion is valid, and log the user in.
- * @param {string} assertion Assertion to verify.
- * @param {string} next URL to redirect the user to if the assertion is
- * valid.
- * @return {jQuery.Deferred} Deferred that resolves with the login view
- * response once login is complete.
- */
- verifyAssertion: function verifyAssertion(assertion, next) {
- var info = this.getInfo();
- return this.getCsrfToken().then(function(csrfToken) {
- return $.ajax(info.loginUrl, {
- type: 'POST',
- data: {assertion: assertion, next: next},
- headers: {'X-CSRFToken': csrfToken},
- });
- });
- },
- // Cache for the info fetched by django_browserid.getInfo().
- _info: null,
- /**
- * Fetch the info for the Persona popup and login requests.
- * @return {object} Data encoded in the browserid-info tag.
- */
- getInfo: function getInfo() {
- if (!this._info) {
- this._info = $('#browserid-info').data('info');
- }
- return this._info;
- },
- /**
- * Fetch a CSRF token from the backend.
- * @return {jqXHR} jQuery XmlHttpResponse that returns the token.
- */
- getCsrfToken: function getCsrfToken() {
- return $.get(this.getInfo().csrfUrl);
- },
- // Deferred for post-watch-callback actions.
- // Stored on the public API so tests can reset it.
- _requestDeferred: null,
- /**
- * Register callbacks with navigator.id.watch that make the API work.
- * This must be called before calling any other API methods.
- * @param {function} Function to run once the user agent is ready to
- * process login requests.
- */
- registerWatchHandlers: function registerWatchHandlers(onReady) {
- var assertion = null;
- var self = this;
- navigator.id.watch({
- onlogin: function(assertion) {
- if (self._requestDeferred) {
- self._requestDeferred.resolve(assertion);
- }
- },
- onready: onReady,
- });
- }
- };
- window.django_browserid = django_browserid;
- })(window.jQuery, window.navigator, window.location);
|