Merge pull request #249 from JonathanPrince/add_api_gateway_support

Add config option for setting api token
This commit is contained in:
Miroslav Bajtoš 2018-09-14 15:58:44 +02:00 committed by GitHub
commit 332822f26c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 68 additions and 1 deletions

View File

@ -160,3 +160,26 @@ Options are passed to `explorer(app, options)`.
> Default: Read from package.json
> Sets your API version. If not present, will read from your app's package.json.
`auth`: **Object**
> Optional config for setting api access token, can be used to rename the query parameter or set an auth header.
> The object has 2 keys:
> - `in`: either `header` or `query`
> - `name`: the name of the query parameter or header
>
> The default sets the token as a query parameter with the name `access_token`
> Example for setting the api key in a header named `x-api-key`:
> ```
> {
> "loopback-component-explorer": {
> "mountPath": "/explorer",
> "auth": {
> "in": "header",
> "name": "x-api-key"
> }
> }
> }
> ```

View File

@ -69,12 +69,17 @@ function routes(loopbackApplication, options) {
// Get the path we're mounted at. It's best to get this from the referer
// in case we're proxied at a deep path.
var source = url.parse(req.headers.referer || '').pathname;
// strip index.html if present in referer
if (source && /\/index\.html$/.test(source)) {
source = source.replace(/\/index\.html$/, '');
}
// If no referer is available, use the incoming url.
if (!source) {
source = req.originalUrl.replace(/\/config.json(\?.*)?$/, '');
}
res.send({
url: urlJoin(source, '/' + options.resourcePath),
auth: options.auth,
});
});

View File

@ -27,6 +27,7 @@ $(function() {
validatorUrl: null,
url: config.url || '/swagger/resources',
apiKey: '',
auth: config.auth,
dom_id: 'swagger-ui-container',
supportHeaderParams: true,
onComplete: function(swaggerApi, swaggerUi) {
@ -76,12 +77,15 @@ $(function() {
function setAccessToken(e) {
e.stopPropagation(); // Don't let the default #explore handler fire
e.preventDefault();
var authOptions = window.swaggerUi.options.auth || {};
var keyLocation = authOptions.in || 'query';
var keyName = authOptions.name || 'access_token';
var key = $('#input_accessToken')[0].value;
log('key: ' + key);
if (key && key.trim() !== '') {
log('added accessToken ' + key);
var apiKeyAuth =
new SwaggerClient.ApiKeyAuthorization('access_token', key, 'query');
new SwaggerClient.ApiKeyAuthorization(keyName, key, keyLocation);
window.swaggerUi.api.clientAuthorizations.add('key', apiKeyAuth);
accessToken = key;
$('.accessTokenDisplay').text('Token Set.').addClass('set');

View File

@ -33,6 +33,40 @@ describe('explorer', function() {
.get('/explorer/')
.expect('Content-Type', /html/)
.expect(200)
.end(function(err, res) {
if (err) return done(err);
assert(!!~res.text.indexOf('<title>LoopBack API Explorer</title>'),
'text does not contain expected string');
done();
});
});
it('should serve correct swagger-ui config', function(done) {
request(this.app)
.get('/explorer/config.json')
.expect('Content-Type', /json/)
.expect(200)
.end(function(err, res) {
if (err) return done(err);
expect(res.body).to
.have.property('url', '/explorer/swagger.json');
done();
});
});
});
describe('when filename is included in url', function() {
beforeEach(givenLoopBackAppWithExplorer());
it('should serve the explorer at /explorer/index.html', function(done) {
request(this.app)
.get('/explorer/index.html')
.expect('Content-Type', /html/)
.expect(200)
.end(function(err, res) {
if (err) throw err;
@ -46,6 +80,7 @@ describe('explorer', function() {
it('should serve correct swagger-ui config', function(done) {
request(this.app)
.get('/explorer/config.json')
.set('Referer', 'http://example.com/explorer/index.html')
.expect('Content-Type', /json/)
.expect(200)
.end(function(err, res) {