提交 a2ae791b 编写于 作者: R Rachel Macfarlane

Add logging to account extension

上级 c16a8d0e
......@@ -10,6 +10,7 @@ import * as querystring from 'querystring';
import { keychain } from './keychain';
import { toBase64UrlEncoding } from './utils';
import { createServer, startServer } from './authServer';
import Logger from './logger';
const redirectUrl = 'https://vscode-redirect.azurewebsites.net/';
const loginEndpointUrl = 'https://login.microsoftonline.com/';
......@@ -82,6 +83,7 @@ export class AzureActiveDirectoryService {
}
public async login(): Promise<void> {
Logger.info('Logging in...');
const nonce = crypto.randomBytes(16).toString('base64');
const { server, redirectPromise, codePromise } = createServer(nonce);
......@@ -120,9 +122,11 @@ export class AzureActiveDirectoryService {
}
token = await this.exchangeCodeForToken(codeRes.code, codeVerifier);
this.setToken(token);
Logger.info('Login successful');
res.writeHead(302, { Location: '/' });
res.end();
} catch (err) {
Logger.error(err.message);
res.writeHead(302, { Location: `/?error=${encodeURIComponent(err && err.message || 'Unknown error')}` });
res.end();
}
......@@ -155,6 +159,7 @@ export class AzureActiveDirectoryService {
private async exchangeCodeForToken(code: string, codeVerifier: string): Promise<IToken> {
return new Promise((resolve: (value: IToken) => void, reject) => {
Logger.info('Exchanging login code for token');
try {
const postData = querystring.stringify({
grant_type: 'authorization_code',
......@@ -202,6 +207,7 @@ export class AzureActiveDirectoryService {
});
} catch (e) {
Logger.error(e.message);
reject(e);
}
});
......@@ -209,6 +215,7 @@ export class AzureActiveDirectoryService {
private async refreshToken(refreshToken: string): Promise<IToken> {
return new Promise((resolve: (value: IToken) => void, reject) => {
Logger.info('Refreshing token...');
const postData = querystring.stringify({
refresh_token: refreshToken,
client_id: clientId,
......@@ -238,9 +245,11 @@ export class AzureActiveDirectoryService {
refreshToken: json.refresh_token
};
this.setToken(token);
Logger.info('Token refresh success');
resolve(token);
} else {
await this.logout();
Logger.error('Refreshing token failed');
reject(new Error('Refreshing token failed.'));
}
});
......@@ -250,12 +259,14 @@ export class AzureActiveDirectoryService {
post.end();
post.on('error', err => {
Logger.error(err.message);
reject(err);
});
});
}
public async logout() {
Logger.info('Logging out');
delete this._token;
await keychain.deleteToken();
if (this._refreshTimeout) {
......
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as vscode from 'vscode';
type LogLevel = 'Trace' | 'Info' | 'Error';
class Log {
private output: vscode.OutputChannel;
constructor() {
this.output = vscode.window.createOutputChannel('Account');
}
private data2String(data: any): string {
if (data instanceof Error) {
return data.stack || data.message;
}
if (data.success === false && data.message) {
return data.message;
}
return data.toString();
}
public info(message: string, data?: any): void {
this.logLevel('Info', message, data);
}
public error(message: string, data?: any): void {
this.logLevel('Error', message, data);
}
public logLevel(level: LogLevel, message: string, data?: any): void {
this.output.appendLine(`[${level} - ${this.now()}] ${message}`);
if (data) {
this.output.appendLine(this.data2String(data));
}
}
private now(): string {
const now = new Date();
return padLeft(now.getUTCHours() + '', 2, '0')
+ ':' + padLeft(now.getMinutes() + '', 2, '0')
+ ':' + padLeft(now.getUTCSeconds() + '', 2, '0') + '.' + now.getMilliseconds();
}
}
function padLeft(s: string, n: number, pad = ' ') {
return pad.repeat(Math.max(0, n - s.length)) + s;
}
const Logger = new Log();
export default Logger;
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册