auth.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { KeyringPair } from '@polkadot/keyring/types'
  2. import { u8aToHex } from '@polkadot/util'
  3. import { signatureVerify } from '@polkadot/util-crypto'
  4. import base64url from 'base64url'
  5. export interface UploadTokenRequest {
  6. data: UploadTokenRequestBody
  7. signature: string
  8. }
  9. export interface UploadTokenRequestBody extends RequestData {
  10. memberId: number
  11. accountId: string
  12. }
  13. export interface RequestData {
  14. dataObjectId: number
  15. storageBucketId: number
  16. bagId: string
  17. }
  18. export interface UploadTokenBody extends RequestData {
  19. validUntil: number // timestamp
  20. nonce: string
  21. }
  22. export interface UploadToken {
  23. data: UploadTokenBody
  24. signature: string
  25. }
  26. export function parseUploadToken(tokenString: string): UploadToken {
  27. return JSON.parse(base64url.decode(tokenString))
  28. }
  29. export function verifyTokenSignature(
  30. token: UploadToken | UploadTokenRequest,
  31. address: string
  32. ): boolean {
  33. const message = JSON.stringify(token.data)
  34. const { isValid } = signatureVerify(message, token.signature, address)
  35. return isValid
  36. }
  37. export function signTokenBody(
  38. tokenBody: UploadTokenBody | UploadTokenRequestBody,
  39. account: KeyringPair
  40. ): string {
  41. const message = JSON.stringify(tokenBody)
  42. const signature = u8aToHex(account.sign(message))
  43. return signature
  44. }
  45. export function createUploadToken(
  46. tokenBody: UploadTokenBody,
  47. account: KeyringPair
  48. ): string {
  49. const signature = signTokenBody(tokenBody, account)
  50. const token = {
  51. data: tokenBody,
  52. signature,
  53. }
  54. return base64url.encode(JSON.stringify(token))
  55. }