Skip to content

Commit d425dbc

Browse files
committed
feat: added polykey auth login command
1 parent 094c48f commit d425dbc

File tree

4 files changed

+125
-0
lines changed

4 files changed

+125
-0
lines changed

src/auth/CommandAuth.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import CommandLogin from './CommandLogin.js';
2+
import CommandPolykey from '../CommandPolykey.js';
3+
4+
class CommandAuth extends CommandPolykey {
5+
constructor(...args: ConstructorParameters<typeof CommandPolykey>) {
6+
super(...args);
7+
this.name('auth');
8+
this.description('Authentication operations');
9+
this.addCommand(new CommandLogin(...args));
10+
}
11+
}
12+
13+
export default CommandAuth;

src/auth/CommandLogin.ts

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import type PolykeyClient from 'polykey/PolykeyClient.js';
2+
import CommandPolykey from '../CommandPolykey.js';
3+
import * as binProcessors from '../utils/processors.js';
4+
import * as binUtils from '../utils/index.js';
5+
import * as binOptions from '../utils/options.js';
6+
7+
class CommandLogin extends CommandPolykey {
8+
constructor(...args: ConstructorParameters<typeof CommandPolykey>) {
9+
super(...args);
10+
this.name('login');
11+
this.description('Login to a platform with Polykey identity');
12+
this.argument('<token>', 'Token provided by platform for logging in');
13+
this.addOption(binOptions.nodeId);
14+
this.addOption(binOptions.clientHost);
15+
this.addOption(binOptions.clientPort);
16+
this.action(async (token, options) => {
17+
const { default: PolykeyClient } = await import(
18+
'polykey/PolykeyClient.js'
19+
);
20+
const { default: Token } = await import('polykey/tokens/Token.js');
21+
const keysUtils = await import('polykey/keys/utils/index.js');
22+
const tokensUtils = await import('polykey/tokens/utils.js');
23+
24+
const clientOptions = await binProcessors.processClientOptions(
25+
options.nodePath,
26+
options.nodeId,
27+
options.clientHost,
28+
options.clientPort,
29+
this.fs,
30+
this.logger.getChild(binProcessors.processClientOptions.name),
31+
);
32+
const meta = await binProcessors.processAuthentication(
33+
options.passwordFile,
34+
this.fs,
35+
);
36+
37+
let pkClient: PolykeyClient;
38+
this.exitHandlers.handlers.push(async () => {
39+
if (pkClient != null) await pkClient.stop();
40+
});
41+
try {
42+
pkClient = await PolykeyClient.createPolykeyClient({
43+
nodeId: clientOptions.nodeId,
44+
host: clientOptions.clientHost,
45+
port: clientOptions.clientPort,
46+
options: {
47+
nodePath: options.nodePath,
48+
},
49+
logger: this.logger.getChild(PolykeyClient.name),
50+
});
51+
const keyPair = keysUtils.generateKeyPair();
52+
const inTok = Token.fromPayload({
53+
returnUrl: 'localhost:8000',
54+
publicKey: keyPair.publicKey.toString('base64url'),
55+
});
56+
inTok.signWithPrivateKey(keyPair);
57+
console.log(`tok: ${inTok.toEncoded()}`);
58+
// token = inTok.toEncoded();
59+
60+
// // Compact JWTs are in xxxx.yyyy.zzzz format where x is the protected
61+
// // header, y is the payload, and z is the binary signature.
62+
// const [protectedHeader, payload, signature] = token.split('.');
63+
// const tokenProtectedHeader =
64+
// tokensUtils.parseTokenProtectedHeader(protectedHeader);
65+
// const tokenPayload = tokensUtils.parseTokenPayload(payload);
66+
// const tokenSignature = tokensUtils.parseTokenSignature(signature);
67+
// const parsedToken = {
68+
// payload: tokenPayload,
69+
// signatures: [
70+
// {
71+
// protected: tokenProtectedHeader,
72+
// signature: tokenSignature,
73+
// }
74+
// ]
75+
// };
76+
const parsedToken = inTok;
77+
console.log(`parsed: ${JSON.stringify(parsedToken)}\n`);
78+
// const incomingToken = Token.fromSigned(parsedToken);
79+
// const tokenJson = incomingToken.toJSON();
80+
const response = await binUtils.retryAuthentication(
81+
(auth) =>
82+
pkClient.rpcClient.methods.authSignToken({
83+
metadata: auth,
84+
payload: inTok.toEncoded().payload,
85+
signatures: inTok.toEncoded().signatures,
86+
// signatures: [{protectees.protecHeaderteok.signature}],
87+
}),
88+
meta,
89+
);
90+
const tokenOut = {
91+
payload: response.payload,
92+
signatures: response.signatures,
93+
};
94+
console.log(`received: ${JSON.stringify(tokenOut)}\n`);
95+
console.log(`payload: ${JSON.stringify(tokensUtils.parseTokenPayload(tokenOut.payload))}\n`);
96+
console.log(`inc payload: ${JSON.stringify(tokensUtils.parseTokenPayload((tokensUtils.parseTokenPayload(tokenOut.payload).requestToken! as any).payload!))}\n`);
97+
// await fetch(parsedToken.payload.returnUrl, {
98+
// method: 'POST',
99+
// body: JSON.stringify(tokenOut),
100+
// });
101+
// console.log(`sent payload`);
102+
} finally {
103+
if (pkClient! != null) await pkClient.stop();
104+
}
105+
});
106+
}
107+
}
108+
109+
export default CommandLogin;

src/auth/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from './CommandAuth.js';

src/polykey.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ async function polykeyMain(argv: Array<string>): Promise<number> {
152152
const { default: CommandBootstrap } = await import('./bootstrap/index.js');
153153
const { default: CommandAgent } = await import('./agent/index.js');
154154
const { default: CommandAudit } = await import('./audit/index.js');
155+
const { default: CommandAuth } = await import('./auth/index.js');
155156
const { default: CommandVaults } = await import('./vaults/index.js');
156157
const { default: CommandSecrets } = await import('./secrets/index.js');
157158
const { default: CommandKeys } = await import('./keys/index.js');
@@ -181,6 +182,7 @@ async function polykeyMain(argv: Array<string>): Promise<number> {
181182
rootCommand.addCommand(new CommandBootstrap({ exitHandlers, fs }));
182183
rootCommand.addCommand(new CommandAgent({ exitHandlers, fs }));
183184
rootCommand.addCommand(new CommandAudit({ exitHandlers, fs }));
185+
rootCommand.addCommand(new CommandAuth({ exitHandlers, fs }));
184186
rootCommand.addCommand(new CommandNodes({ exitHandlers, fs }));
185187
rootCommand.addCommand(new CommandSecrets({ exitHandlers, fs }));
186188
rootCommand.addCommand(new CommandKeys({ exitHandlers, fs }));

0 commit comments

Comments
 (0)