<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://wiki.bristolhackspace.org/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="https://wiki.bristolhackspace.org/feed.php">
        <title>Bristol Hackspace Wiki - projects:member_portal</title>
        <description></description>
        <link>https://wiki.bristolhackspace.org/</link>
        <image rdf:resource="https://wiki.bristolhackspace.org/_media/wiki/logo.png" />
       <dc:date>2026-04-14T15:41:00+00:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="https://wiki.bristolhackspace.org/projects/member_portal/auth?rev=1759765622&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.bristolhackspace.org/projects/member_portal/home?rev=1761264946&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.bristolhackspace.org/projects/member_portal/jwk?rev=1759880940&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.bristolhackspace.org/projects/member_portal/oauth?rev=1760357690&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.bristolhackspace.org/projects/member_portal/permissions?rev=1759765716&amp;do=diff"/>
                <rdf:li rdf:resource="https://wiki.bristolhackspace.org/projects/member_portal/session?rev=1759870352&amp;do=diff"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="https://wiki.bristolhackspace.org/_media/wiki/logo.png">
        <title>Bristol Hackspace Wiki</title>
        <link>https://wiki.bristolhackspace.org/</link>
        <url>https://wiki.bristolhackspace.org/_media/wiki/logo.png</url>
    </image>
    <item rdf:about="https://wiki.bristolhackspace.org/projects/member_portal/auth?rev=1759765622&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-06T15:47:02+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>Authentication</title>
        <link>https://wiki.bristolhackspace.org/projects/member_portal/auth?rev=1759765622&amp;do=diff</link>
        <description>Authentication

Authentication methods

There will be a few methods supported:

	*  Email “magic link”
	*  Keyfob/card
	*  TOTP (e.g. Google Authenticator)
	*  Passkey

Password login won&#039;t be supported to begin with unless there is a strong demand for it.</description>
    </item>
    <item rdf:about="https://wiki.bristolhackspace.org/projects/member_portal/home?rev=1761264946&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-24T00:15:46+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>Member Portal V2</title>
        <link>https://wiki.bristolhackspace.org/projects/member_portal/home?rev=1761264946&amp;do=diff</link>
        <description>Member Portal V2

This is a project driven by @samp20 to build a new member portal to provide Single-Sign-On (SSO) to other Hackspace services.


	* Authentication
	* JSON Web Keys
	* OAuth
	* Permissions model
	* Session management



Architecture

The system is based on a Python Flask application with PostgreSQL as the backend database.</description>
    </item>
    <item rdf:about="https://wiki.bristolhackspace.org/projects/member_portal/jwk?rev=1759880940&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-07T23:49:00+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>JSON Web Keys</title>
        <link>https://wiki.bristolhackspace.org/projects/member_portal/jwk?rev=1759880940&amp;do=diff</link>
        <description>JSON Web Keys

The OpenID specification requires a JWKs endpoint to list public keys that can verify ID tokens.

Current thinking is to store them in the filesystem either in PEM or JSON format. A Flask command can be created to rotate these on a schedule. These should be stored with the correct file permissions (</description>
    </item>
    <item rdf:about="https://wiki.bristolhackspace.org/projects/member_portal/oauth?rev=1760357690&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-13T12:14:50+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>OAuth</title>
        <link>https://wiki.bristolhackspace.org/projects/member_portal/oauth?rev=1760357690&amp;do=diff</link>
        <description>OAuth

Capturing the request
 Column  Type  Obtained from  Description  id  UUID  Generated  ID to keep track of the request  token_hash  str  Generated  Hash of a secret token stored in a flow cookie  session_id  Optional FK  Logged in session  Associated login session</description>
    </item>
    <item rdf:about="https://wiki.bristolhackspace.org/projects/member_portal/permissions?rev=1759765716&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-06T15:48:36+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>Permissions model</title>
        <link>https://wiki.bristolhackspace.org/projects/member_portal/permissions?rev=1759765716&amp;do=diff</link>
        <description>Permissions model

Permissions shall be granted through OAuth scopes or other custom claims. As these claims can sometimes be application specific, a general purpose approach is proposed using Members, Roles and ClaimSets with the following relationships:</description>
    </item>
    <item rdf:about="https://wiki.bristolhackspace.org/projects/member_portal/session?rev=1759870352&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-07T20:52:32+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>Session management</title>
        <link>https://wiki.bristolhackspace.org/projects/member_portal/session?rev=1759870352&amp;do=diff</link>
        <description>Session management

Sessions will be referenced by long-lived cookies (e.g. 30 days) that get refreshed on use. The session data itself will be stored in a Session table. The currently planned data includes:
 Column  Type  Description  id      UUID  Session ID</description>
    </item>
</rdf:RDF>
