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;