mirror of
https://gitlab.com/comunic/comunicconsole
synced 2024-11-27 07:49:22 +00:00
Can authenticate using security key
This commit is contained in:
parent
34c07bfac8
commit
d01aa9272c
@ -180,12 +180,72 @@ export class AccountHelper {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
console.info(cred);
|
|
||||||
console.info(res);
|
|
||||||
|
|
||||||
await serverRequest("accounts/register_key", {
|
await serverRequest("accounts/register_key", {
|
||||||
name: name,
|
name: name,
|
||||||
key: JSON.stringify(res),
|
key: JSON.stringify(res),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* First step of security key authentication
|
||||||
|
*
|
||||||
|
* @param mail Target admin account email address
|
||||||
|
* @param key The key to use to authentifcate
|
||||||
|
*/
|
||||||
|
static async GetAuthenticationChallenge(
|
||||||
|
mail: string,
|
||||||
|
key: AuthKey
|
||||||
|
): Promise<any> {
|
||||||
|
const res = await serverRequest("accounts/challenge_auth_with_key", {
|
||||||
|
mail: mail,
|
||||||
|
key_id: key.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
res.publicKey.challenge = base64NoPaddingToUint8Array(
|
||||||
|
res.publicKey.challenge
|
||||||
|
);
|
||||||
|
|
||||||
|
for (let cred of res.publicKey.allowCredentials) {
|
||||||
|
cred.id = base64NoPaddingToUint8Array(cred.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt to sign in using security key
|
||||||
|
*
|
||||||
|
* @param mail Target admin account email address
|
||||||
|
* @param key Key used to authenticate
|
||||||
|
* @param cred Response to authentication
|
||||||
|
*/
|
||||||
|
static async AuthenticateWithKey(
|
||||||
|
mail: string,
|
||||||
|
key: AuthKey,
|
||||||
|
cred: any
|
||||||
|
): Promise<any> {
|
||||||
|
const creds = {
|
||||||
|
id: cred.id,
|
||||||
|
rawId: ArrayBufferToBase64(cred.rawId),
|
||||||
|
type: cred.type,
|
||||||
|
response: {
|
||||||
|
authenticatorData: ArrayBufferToBase64(
|
||||||
|
cred.response.authenticatorData
|
||||||
|
),
|
||||||
|
clientDataJSON: ArrayBufferToBase64(
|
||||||
|
cred.response.clientDataJSON
|
||||||
|
),
|
||||||
|
signature: ArrayBufferToBase64(cred.response.signature),
|
||||||
|
userHandle: cred.response.userHandle,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const res = await serverRequest("accounts/auth_with_key", {
|
||||||
|
mail: mail,
|
||||||
|
key_id: key.id,
|
||||||
|
credential: JSON.stringify(creds),
|
||||||
|
});
|
||||||
|
|
||||||
|
sessionStorage.setItem(SESSION_STORAGE_TOKEN, res.token);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,11 @@ import {
|
|||||||
import { ErrorOutline, Lock, VpnKey } from "@material-ui/icons";
|
import { ErrorOutline, Lock, VpnKey } from "@material-ui/icons";
|
||||||
import LockOutlinedIcon from "@material-ui/icons/LockOutlined";
|
import LockOutlinedIcon from "@material-ui/icons/LockOutlined";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { AccountHelper, AuthOptions } from "../../helpers/AccountHelper";
|
import {
|
||||||
|
AccountHelper,
|
||||||
|
AuthKey,
|
||||||
|
AuthOptions,
|
||||||
|
} from "../../helpers/AccountHelper";
|
||||||
import { input, matAlert } from "../widgets/DialogsProvider";
|
import { input, matAlert } from "../widgets/DialogsProvider";
|
||||||
|
|
||||||
function ErrorGettingOptions() {
|
function ErrorGettingOptions() {
|
||||||
@ -238,8 +242,26 @@ class AuthOptionsWidget extends React.Component<
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async loginWithSecurityKey(id: number) {
|
async loginWithSecurityKey(key: AuthKey) {
|
||||||
console.info(id);
|
try {
|
||||||
|
const challenge = await AccountHelper.GetAuthenticationChallenge(
|
||||||
|
this.props.email,
|
||||||
|
key
|
||||||
|
);
|
||||||
|
|
||||||
|
const result = await navigator.credentials.get(challenge);
|
||||||
|
|
||||||
|
await AccountHelper.AuthenticateWithKey(
|
||||||
|
this.props.email,
|
||||||
|
key,
|
||||||
|
result
|
||||||
|
);
|
||||||
|
|
||||||
|
document.location.href = document.location.href + "";
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
matAlert("Authentication with security key failed!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@ -266,7 +288,7 @@ class AuthOptionsWidget extends React.Component<
|
|||||||
{this.props.options.keys.map((key) => (
|
{this.props.options.keys.map((key) => (
|
||||||
<ListItem
|
<ListItem
|
||||||
button
|
button
|
||||||
onClick={() => this.loginWithSecurityKey(key.id)}
|
onClick={() => this.loginWithSecurityKey(key)}
|
||||||
key={key.id}
|
key={key.id}
|
||||||
>
|
>
|
||||||
<ListItemAvatar>
|
<ListItemAvatar>
|
||||||
|
Loading…
Reference in New Issue
Block a user