Commit a213c689 authored by Ben Galloway's avatar Ben Galloway

Working version

parent 61ea7873
...@@ -3,121 +3,93 @@ ...@@ -3,121 +3,93 @@
Object.defineProperty(exports, "__esModule", { Object.defineProperty(exports, "__esModule", {
value: true value: true
}); });
exports.isTokenExpired = exports.GSCAuthConsumer = exports.GSCAuthProvider = void 0; exports.default = void 0;
var _react = _interopRequireDefault(require("react")); var _react = _interopRequireDefault(require("react"));
var _reactAadMsal = require("react-aad-msal"); var _msalB2cReact = _interopRequireDefault(require("@kdpw/msal-b2c-react"));
var _jwtDecode = _interopRequireDefault(require("jwt-decode"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var tokenIsExpired = function tokenIsExpired(decodedToken) {
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
var isTokenExpired = function isTokenExpired(token) {
try { try {
var decoded = (0, _jwtDecode.default)(token); if (decodedToken.exp < Date.now() / 1000) {
if (decoded.exp < Date.now() / 1000) {
return true; return true;
} else return false; } else return false;
} catch (err) { } catch (err) {
return false; console.error(err);
return true;
} }
}; };
exports.isTokenExpired = isTokenExpired; var hasValidLogin = function hasValidLogin(authValues) {
var emptyAuthObject = { var token = authValues.idToken;
userInfo: { return token && !tokenIsExpired(token);
jwtAccessToken: "",
jwtIdToken: "",
user: {}
},
login: function login() {},
logout: function logout() {}
}; };
var GSCAuthContext = _react.default.createContext(emptyAuthObject); var runGSCAuth = _msalB2cReact.default.run;
var requireGSCAuth = _msalB2cReact.default.required;
var GSCAuthConsumer = GSCAuthContext.Consumer;
exports.GSCAuthConsumer = GSCAuthConsumer;
var GSCAuthProvider = var getAuthValues = function getAuthValues() {
/*#__PURE__*/ return {
function (_React$Component) { userName: _msalB2cReact.default.getUserName(),
_inherits(GSCAuthProvider, _React$Component); idToken: _msalB2cReact.default.getIdToken(),
accessToken: _msalB2cReact.default.getAccessToken()
function GSCAuthProvider() { };
var _this; };
_classCallCheck(this, GSCAuthProvider); var initGSCAuth = function initGSCAuth(applicationId, redirectUri, scopes, cacheLocation) {
if (!applicationId) throw new Error("GSCAuth must be provided with an Azure AD application UUID");
if (!redirectUri) throw new Error("GSCAuth must be provided with a redirect URI, as configured in the Azure AD portal");
_msalB2cReact.default.initialize({
instance: "https://login.microsoftonline.com/",
tenant: "f62a415a-76c0-4075-9eb3-f31250de2db2",
signInPolicy: "",
resetPolicy: "",
applicationId: applicationId,
cacheLocation: cacheLocation,
scopes: scopes,
redirectUri: redirectUri,
postLogoutRedirectUri: "https://www.glasgowsciencecentre.org",
validateAuthority: true
});
_this = _possibleConstructorReturn(this, _getPrototypeOf(GSCAuthProvider).call(this, props)); var GSCAuthContext = _react.default.createContext(getAuthValues());
_this.state = emptyAuthObject;
_this.loginCallback = _this.loginCallback.bind(_assertThisInitialized(_assertThisInitialized(_this)));
_this.logoutCallback = _this.logoutCallback.bind(_assertThisInitialized(_assertThisInitialized(_this)));
_this.userInfoCallback = _this.userInfoCallback.bind(_assertThisInitialized(_assertThisInitialized(_this)));
return _this;
}
_createClass(GSCAuthProvider, [{ var GSCAuthProvider = GSCAuthContext.Provider;
key: "loginCallback", var GSCAuthConsumer = GSCAuthContext.Consumer;
value: function loginCallback(login) { return {
this.setState({ GSCAuthProvider: GSCAuthProvider,
login: login GSCAuthConsumer: GSCAuthConsumer
}); };
} };
}, {
key: "logoutCallback",
value: function logoutCallback(logout) {
this.setState({
logout: logout
});
}
}, {
key: "userInfoCallback",
value: function userInfoCallback(userInfo) {
this.setState({
userInfo: userInfo
});
}
}, {
key: "render",
value: function render() {
return _react.default.createElement(_reactAadMsal.AzureAD, {
provider: new _reactAadMsal.MsalAuthProviderFactory({
clientID: this.props.appId,
scopes: this.props.scopes || [],
type: _reactAadMsal.LoginType[this.props.loginType || "Redirect"],
persistLoginPastSession: this.props.persistLoginPastSession || false
}),
unauthenticatedFunction: this.loginCallback,
authenticatedFunction: this.logoutCallback,
userInfoCallback: this.userInfoCallback
}, _react.default.createElement(GSCAuthContext.Provider, {
value: this.state
}, this.props.children));
}
}]);
return GSCAuthProvider; var setupGSCAuth = function setupGSCAuth(aadAppId, authRedirectUri) {
}(_react.default.Component); var msGraphScopes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ["User.Read"];
var cacheLocation = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "sessionStorage";
var _initGSCAuth = initGSCAuth(aadAppId, authRedirectUri, msGraphScopes, cacheLocation),
GSCAuthProvider = _initGSCAuth.GSCAuthProvider,
GSCAuthConsumer = _initGSCAuth.GSCAuthConsumer;
var initialAuthValues = getAuthValues();
var clearGSCAuth = function clearGSCAuth() {
return window[cacheLocation].clear();
};
return {
GSCAuthProvider: GSCAuthProvider,
GSCAuthConsumer: GSCAuthConsumer,
initialAuthValues: initialAuthValues,
getAuthValues: getAuthValues,
hasValidLogin: hasValidLogin,
runGSCAuth: runGSCAuth,
requireGSCAuth: requireGSCAuth,
clearGSCAuth: clearGSCAuth
};
};
exports.GSCAuthProvider = GSCAuthProvider; var _default = setupGSCAuth;
\ No newline at end of file exports.default = _default;
\ No newline at end of file
...@@ -11,14 +11,10 @@ ...@@ -11,14 +11,10 @@
}, },
"dependencies": { "dependencies": {
"@babel/polyfill": "^7.2.5", "@babel/polyfill": "^7.2.5",
"jwt-decode": "^2.2.0", "@kdpw/msal-b2c-react": "^0.0.2"
"react-aad-msal": "^0.4.1"
},
"resolutions": {
"react-aad-msal/babel-jest": ">=23.6.0"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^16.7.0" "react": ">=16.8.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.2.3", "@babel/cli": "^7.2.3",
......
import React from "react"; import React from "react";
import { AzureAD, MsalAuthProviderFactory, LoginType } from "react-aad-msal"; import authentication from "@kdpw/msal-b2c-react";
import decode from "jwt-decode";
const isTokenExpired = token => { const tokenIsExpired = decodedToken => {
try { try {
const decoded = decode(token); if (decodedToken.exp < Date.now() / 1000) {
if (decoded.exp < Date.now() / 1000) {
return true; return true;
} else return false; } else return false;
} catch (err) { } catch (err) {
return false; console.error(err);
return true;
} }
}; };
const emptyAuthObject = { const hasValidLogin = authValues => {
userInfo: { const token = authValues.idToken;
jwtAccessToken: "", return token && !tokenIsExpired(token);
jwtIdToken: "",
user: {},
},
login: () => {},
logout: () => {},
}; };
const GSCAuthContext = React.createContext(emptyAuthObject); const runGSCAuth = authentication.run;
const GSCAuthConsumer = GSCAuthContext.Consumer; const requireGSCAuth = authentication.required;
class GSCAuthProvider extends React.Component { const getAuthValues = () => ({
constructor() { userName: authentication.getUserName(),
super(props); idToken: authentication.getIdToken(),
this.state = emptyAuthObject; accessToken: authentication.getAccessToken(),
});
this.loginCallback = this.loginCallback.bind(this); const initGSCAuth = (applicationId, redirectUri, scopes, cacheLocation) => {
this.logoutCallback = this.logoutCallback.bind(this); if (!applicationId) throw new Error("GSCAuth must be provided with an Azure AD application UUID");
this.userInfoCallback = this.userInfoCallback.bind(this); if (!redirectUri)
} throw new Error("GSCAuth must be provided with a redirect URI, as configured in the Azure AD portal");
authentication.initialize({
instance: "https://login.microsoftonline.com/",
tenant: "f62a415a-76c0-4075-9eb3-f31250de2db2",
signInPolicy: "",
resetPolicy: "",
applicationId,
cacheLocation,
scopes,
redirectUri,
postLogoutRedirectUri: "https://www.glasgowsciencecentre.org",
validateAuthority: true,
});
loginCallback(login) { const GSCAuthContext = React.createContext(getAuthValues());
this.setState({ login }); const GSCAuthProvider = GSCAuthContext.Provider;
} const GSCAuthConsumer = GSCAuthContext.Consumer;
logoutCallback(logout) { return { GSCAuthProvider, GSCAuthConsumer };
this.setState({ logout }); };
}
userInfoCallback(userInfo) { const setupGSCAuth = (aadAppId, authRedirectUri, msGraphScopes = ["User.Read"], cacheLocation = "sessionStorage") => {
this.setState({ userInfo }); const { GSCAuthProvider, GSCAuthConsumer } = initGSCAuth(aadAppId, authRedirectUri, msGraphScopes, cacheLocation);
} const initialAuthValues = getAuthValues();
const clearGSCAuth = () => window[cacheLocation].clear();
render() { return {
return ( GSCAuthProvider,
<AzureAD GSCAuthConsumer,
provider={ initialAuthValues,
new MsalAuthProviderFactory({ getAuthValues,
clientID: this.props.appId, hasValidLogin,
scopes: this.props.scopes || [], runGSCAuth,
type: LoginType[this.props.loginType || "Redirect"], requireGSCAuth,
persistLoginPastSession: this.props.persistLoginPastSession || false, clearGSCAuth,
}) };
} };
unauthenticatedFunction={this.loginCallback}
authenticatedFunction={this.logoutCallback}
userInfoCallback={this.userInfoCallback}
>
<GSCAuthContext.Provider value={this.state}>{this.props.children}</GSCAuthContext.Provider>
</AzureAD>
);
}
}
export { GSCAuthProvider, GSCAuthConsumer, isTokenExpired }; export default setupGSCAuth;
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment