|
@@ -1,6 +1,7 @@
|
|
|
import { KeyringPair } from '@polkadot/keyring/types'
|
|
|
-import { stringToU8a, u8aToHex } from '@polkadot/util'
|
|
|
+import { u8aToHex } from '@polkadot/util'
|
|
|
import { signatureVerify } from '@polkadot/util-crypto'
|
|
|
+import base64url from 'base64url'
|
|
|
|
|
|
export interface TokenRequest {
|
|
|
dataObjectId: number
|
|
@@ -8,23 +9,55 @@ export interface TokenRequest {
|
|
|
bagId: string
|
|
|
}
|
|
|
|
|
|
+export interface TokenBody {
|
|
|
+ dataObjectId: number
|
|
|
+ storageBucketId: number
|
|
|
+ bagId: string
|
|
|
+ timestamp: number
|
|
|
+}
|
|
|
+
|
|
|
+export interface Token {
|
|
|
+ data: TokenBody
|
|
|
+ signature: string
|
|
|
+}
|
|
|
+
|
|
|
+export function parseToken(tokenString: string): Token {
|
|
|
+ return JSON.parse(base64url.decode(tokenString))
|
|
|
+}
|
|
|
+
|
|
|
export function verifyTokenSignature(
|
|
|
- tokenRequest: TokenRequest,
|
|
|
- signature: string,
|
|
|
+ token: Token,
|
|
|
account: KeyringPair
|
|
|
): boolean {
|
|
|
- const message = JSON.stringify(tokenRequest)
|
|
|
- const { isValid } = signatureVerify(message, signature, account.address)
|
|
|
+ const message = JSON.stringify(token.data)
|
|
|
+ const { isValid } = signatureVerify(message, token.signature, account.address)
|
|
|
|
|
|
return isValid
|
|
|
}
|
|
|
|
|
|
-export function signToken(
|
|
|
- tokenRequest: TokenRequest,
|
|
|
- account: KeyringPair
|
|
|
-): string {
|
|
|
- const message = stringToU8a(JSON.stringify(tokenRequest))
|
|
|
- const signature = account.sign(message)
|
|
|
+export function signToken(tokenBody: TokenBody, account: KeyringPair): string {
|
|
|
+ const message = JSON.stringify(tokenBody)
|
|
|
+ const signature = u8aToHex(account.sign(message))
|
|
|
+
|
|
|
+ const token: Token = {
|
|
|
+ data: tokenBody,
|
|
|
+ signature,
|
|
|
+ }
|
|
|
+
|
|
|
+ return base64url.encode(JSON.stringify(token))
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+export function verifyTokenData(token: Token, data: TokenRequest): void {
|
|
|
+ if (token.data.dataObjectId !== data.dataObjectId) {
|
|
|
+ throw new Error('Unexpected dataObjectId')
|
|
|
+ }
|
|
|
+
|
|
|
+ if (token.data.storageBucketId !== data.storageBucketId) {
|
|
|
+ throw new Error('Unexpected storageBucketId')
|
|
|
+ }
|
|
|
|
|
|
- return u8aToHex(signature)
|
|
|
+ if (token.data.bagId !== data.bagId) {
|
|
|
+ throw new Error('Unexpected bagId')
|
|
|
+ }
|
|
|
}
|