
Research
/Security News
Miasma Mini Shai-Hulud Hits ImmobiliareLabs npm Packages
Miasma Mini Shai-Hulud hits @immobiliarelabs Backstage plugins, targeting GitLab and LDAP auth packages on npm.
@flow-industries/auth
Advanced tools
Passkey-first authentication for Flow applications. One passkey bound to `id.flow.industries`, usable across all Flow apps, with optional Tempo chain support.
Passkey-first authentication for Flow applications. One passkey bound to id.flow.industries, usable across all Flow apps, with optional Tempo chain support.
There are two ways to integrate Flow Auth into your app:
Best for apps that use wagmi/viem and want standard React hooks (useAccount, useConnect, useSendTransaction).
Install dependencies:
bun add wagmi viem @tanstack/react-query
Set up the config:
// config.ts
import { createConfig, http, createStorage } from "wagmi"
import { tempo } from "viem/chains"
import { flow } from "@flow/auth/client"
export const config = createConfig({
chains: [tempo],
connectors: [
flow({
host: "https://id.flow.industries/dialog",
rpId: "id.flow.industries",
}),
],
storage: createStorage({ storage: localStorage }),
transports: {
[tempo.id]: http(),
},
})
Wrap your app:
// main.tsx
import { WagmiProvider } from "wagmi"
import { QueryClient, QueryClientProvider } from "@tanstack/react-query"
import { config } from "./config"
const queryClient = new QueryClient()
createRoot(document.getElementById("root")!).render(
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
</WagmiProvider>
)
Use in components:
import { useAccount, useConnect, useConnectors, useDisconnect } from "wagmi"
function Auth() {
const { connect, isPending, error } = useConnect()
const [connector] = useConnectors()
const account = useAccount()
const { disconnect } = useDisconnect()
if (account.isConnected) {
return (
<div>
<p>Connected: {account.address}</p>
<button onClick={() => disconnect()}>Sign out</button>
</div>
)
}
return (
<div>
{/* Sign up — opens dialog with username + passkey creation */}
<button onClick={() => connect({
connector,
capabilities: { type: "sign-up" },
} as any)}>
Sign up
</button>
{/* Sign in — opens dialog, passkey prompt immediately */}
<button onClick={() => connect({
connector,
capabilities: { type: "sign-in" },
} as any)}>
Sign in
</button>
{/* Welcome screen — opens dialog, user chooses */}
<button onClick={() => connect({ connector })}>
Sign in with Flow
</button>
{error && <p>{error.message}</p>}
</div>
)
}
After connecting, the user's Tempo address is available via useAccount(). The passkey credential is persisted in localStorage — useAccount() returns the address on page reload without re-prompting.
Best for apps that don't use wagmi, or want full control over the dialog lifecycle.
import { createDialogHost } from "@flow/auth/client"
const dialog = createDialogHost({
host: "https://id.flow.industries/dialog",
})
Sign up:
const result = await dialog.request("wallet_connect", [
{ capabilities: { createAccount: true } },
])
// result: { user: { id, username }, credential: { id, publicKey } }
Sign in:
const result = await dialog.request("wallet_connect", [
{ capabilities: { signIn: true } },
])
// result: { user: { id, username }, credential: { id, publicKey } }
Welcome screen (user chooses sign up or sign in):
const result = await dialog.request("wallet_connect", [
{ capabilities: {} },
])
Check session:
const res = await fetch("https://id.flow.industries/api/me", {
credentials: "include",
})
const { session } = await res.json()
// session.user.username, session.user.id, etc.
Close the dialog:
dialog.close() // close the iframe
dialog.destroy() // remove from DOM entirely
id.flow.industries)id.flow.industriesAccount.fromWebAuthnP256(credential, { rpId }) reconstructs a signing account from the stored passkeyThe passkey is bound to id.flow.industries via WebAuthn's rpId, so the same passkey works across all Flow apps (flow.game, flow.talk, etc.) through the shared dialog.
| Endpoint | Description |
|---|---|
GET /api/config | Returns { rpId, rpName } |
GET /api/me | Returns current session/user (requires session cookie) |
GET /api/account/username/:name | Check username availability |
GET /api/account/account/:address | Look up username by address |
GET /keys/challenge | Generate WebAuthn challenge |
GET /keys/:credentialId | Get stored public key |
POST /keys/:credentialId | Store public key (with attestation verification) |
POST /api/auth/passkey/register | Create user + passkey + session |
POST /api/auth/passkey/challenge | Generate sign-in challenge |
POST /api/auth/passkey/verify | Verify passkey signature + create session |
bun install
bun run db:push # create/update database tables
bun run dev # starts server (:3000) + dialog (:5175) + playground (:5176)
Playground at http://localhost:5176 — has both Wagmi and Direct integration demos.
FAQs
Passkey-first authentication for Flow applications. One passkey bound to `id.flow.industries`, usable across all Flow apps, with optional Tempo chain support.
The npm package @flow-industries/auth receives a total of 0 weekly downloads. As such, @flow-industries/auth popularity was classified as not popular.
We found that @flow-industries/auth demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
Miasma Mini Shai-Hulud hits @immobiliarelabs Backstage plugins, targeting GitLab and LDAP auth packages on npm.

Security News
Rolldown paused Rust React Compiler integration after a 5MB binary size increase raised concerns about shipping React-specific code to all Vite users.

Security News
/Research
Mini Shai-Hulud expands into the Go ecosystem after hitting LeoPlatform npm packages and targeting GitHub Actions workflows.