Authorization Meta

Authorization Meta

Uses Meta.action_requires so every action defaults to requiring authorization, while authorize stays anonymous. Same password flow as Authorization, but the rule is expressed once on the channel class.

Backend

from rxdjango import ContextChannel, rx, action


class AuthorizationMetaChannel(ContextChannel):

    authorized = rx[bool](False)
    counter = rx[int](0)

    class Meta:
        action_requires = 'authorized'

    @action(anonymous=True)
    async def authorize(self, password: str):
        if password == 'password':
            self.authorized = True
            return True
        return False

    @action
    async def increment(self):
        self.counter += 1

Frontend

import React, { useState } from 'react';
import { useChannel } from '@rxdjango/react';
import { AuthorizationMetaChannel } from '../../rx/authorization_meta/authorization_meta.channels';
import {
  Sections,
  Fields,
  Field,
  Button,
  TextInput,
  Row,
  Note,
} from '../../components/demo';

export function AuthorizationMetaDemo() {
  const channel = useChannel(AuthorizationMetaChannel);
  const [password, setPassword] = useState('password');

  return (
    <Sections>
      <div>
        <Note>
          Authorize with a password (authorization meta channel), then use the counter.
        </Note>
        <Row>
          <TextInput
            id="authorization-meta-password"
            label="Password"
            value={password}
            onChange={setPassword}
          />
          <Button
            variant="secondary"
            onClick={() => channel.authorize(password)}
          >
            Authorize
          </Button>
        </Row>
      </div>
      <div>
        <Fields>
          <Field label="Counter value" large>
            {channel.counter}
          </Field>
        </Fields>
        <Button onClick={channel.increment}>
          Increment
        </Button>
      </div>
    </Sections>
  );
}

export default AuthorizationMetaDemo;