-
Notifications
You must be signed in to change notification settings - Fork 670
/
v1.ts
128 lines (114 loc) · 3.9 KB
/
v1.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
* (C) Copyright IBM Corp. 2015, 2019.
*
* Licensed 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.
*/
import { IncomingHttpHeaders, OutgoingHttpHeaders } from 'http';
import { Authenticator, BaseService, TokenRequestBasedAuthenticator, UserOptions } from 'ibm-cloud-sdk-core';
import url = require('url');
class AuthorizationV1 extends BaseService {
static URL: string = 'https://api.us-south.speech-to-text.watson.cloud.ibm.com/authorization/api';
name: string; // set by prototype to 'authorization'
serviceVersion: string; // set by prototype to 'v1'
// tslint:disable-next-line:variable-name
targetUrl?: string;
/**
* Authorization Service
*
* Generates temporary auth tokens for use in untrusted environments.
* Tokens expire after one hour.
*
* @param {Object} options
* @constructor
*/
constructor(options: UserOptions) {
super(options);
this.targetUrl = options.url;
// replace the url to always point to /authorization/api
const hostname = url.parse(this.baseOptions.url);
hostname.pathname = '/authorization/api';
this.baseOptions.url = url.format(hostname);
}
/**
* If using an RC service, get an IAM access token. If using a CF service,
* get a percent-encoded authorization token based on resource query string param
*
* @param {Object} [options]
* @param {String} [options.url] defaults to url supplied to constructor (if any)
* @param {Function(err, token)} callback - called with a %-encoded token if CF
*/
getToken(params: AuthorizationV1.GetTokenParams | AuthorizationV1.GetTokenCallback, callback?: AuthorizationV1.GetTokenCallback) {
if (typeof params === 'function') {
callback = params;
params = { url: this.targetUrl };
}
const authenticator = this.getAuthenticator();
// if the authenticator is managing a token, return that token
if (authenticator instanceof TokenRequestBasedAuthenticator) {
const options = { headers: {} };
return authenticator.authenticate(options).then(
() => {
callback(null, parseTokenFromHeader(options.headers));
},
err => {
callback(err);
}
);
}
// otherwise, return a CF Watson token
if (!params.url) {
callback(new Error('Missing required parameters: url'));
return;
}
const parameters = {
options: {
method: 'GET',
url: '/v1/token?url=' + params.url
},
defaultOptions: this.baseOptions
};
return this.createRequest(parameters).then(
res => {
callback(null, res);
return res;
},
err => {
callback(err);
}
);
}
}
AuthorizationV1.prototype.name = 'authorization';
AuthorizationV1.prototype.serviceVersion = 'v1';
/*************************
* interfaces
************************/
namespace AuthorizationV1 {
export interface GetTokenResponse {
result: string;
status?: number;
statusText?: string;
headers?: IncomingHttpHeaders;
}
/** The callback for the getToken request. */
export type GetTokenCallback = (error?: Error, response?: string|GetTokenResponse) => void;
/** Parameters for the `getToken` operation */
export interface GetTokenParams {
url?: string;
}
}
function parseTokenFromHeader(headers) {
// get token from format `basic TOKEN` or `bearer TOKEN`
return headers.Authorization ? headers.Authorization.split(' ')[1] : null;
}
export = AuthorizationV1;