
Research
Supply Chain Attack on Axios Pulls Malicious Dependency from npm
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.
@permify/permify-node
Advanced tools
This client makes it easy to interact with Permify from your Node.js application, providing type-safe access to Permify's authorization capabilities.
Use npm to install:
npm install @permify/permify-node
Use yarn to install (Please be aware that Yarn versions greater than v1.10.0 and less than v2 are not supported):
yarn add @permify/permify-node
First, create a new client instance to connect to your Permify server:
import * as permify from "@permify/permify-node";
const client = permify.grpc.newClient({
endpoint: "localhost:3478", // Replace with your Permify server URL
cert: undefined, // Optional: SSL certificate
insecure: true, // Set to false in production
timeout: 5000, // Request timeout in milliseconds
});
import * as permify from "@permify/permify-node";
const client = permify.grpc.newClient({
endpoint: "localhost:3478",
cert: undefined,
insecure: true,
});
client.tenancy
.create({
id: "t1",
name: "Tenant 1",
})
.then((response) => {
console.log(response);
// handle response
});
Define your authorization model using Permify's schema language. Here's a more comprehensive example:
import * as permify from "@permify/permify-node";
const client = permify.grpc.newClient({
endpoint: "localhost:3478",
cert: undefined,
insecure: true,
});
let schema = `
entity user {}
entity document {
relation viewer @user
action view = viewer
}
`;
// Write the schema using the correct method
client.schema.write({
tenantId: "t1",
schema: schema,
})
.then((response) => {
console.log("Schema written successfully:", response);
// handle response - typically contains schemaVersion
})
.catch((error) => {
console.error("Error writing schema:", error);
});
Create relationships between entities to define access rules. Here are some common patterns:
import * as permify from "@permify/permify-node";
const client = permify.grpc.newClient({
endpoint: "localhost:3478",
cert: undefined,
insecure: true,
});
client.relationship
.write({
tenantId: "t1",
metadata: {
schemaVersion: "",
},
tuples: [
{
entity: {
type: "document",
id: "1",
},
relation: "viewer",
subject: {
type: "user",
id: "1",
},
},
],
})
.then((response) => {
// handle response
});
Verify if a user has a specific permission on a resource. Here are different ways to perform checks:
import * as permify from "@permify/permify-node";
const client = permify.grpc.newClient({
endpoint: "localhost:3478",
cert: undefined,
insecure: true,
});
client.permission
.check({
tenantId: "t1",
metadata: {
snapToken: "",
schemaVersion: "",
depth: 20,
},
entity: {
type: "document",
id: "1",
},
permission: "view",
subject: {
type: "user",
id: "3",
},
})
.then((response) => {
if (response.can === permify.grpc.base.CheckResult.CHECK_RESULT_ALLOWED) {
console.log("RESULT_ALLOWED");
} else {
console.log("RESULT_DENIED");
}
});
Subscribe to permission changes in real-time:
import * as permify from "@permify/permify-node";
function main() {
const client = permify.grpc.newClient({
endpoint: "localhost:3478",
cert: undefined,
insecure: true,
});
let res = client.permission.lookupEntityStream({
tenantId: "t1",
metadata: {
snapToken: "",
schemaVersion: "",
depth: 20,
},
entityType: "document",
permission: "view",
subject: {
type: "user",
id: "1",
},
});
handle(res);
}
async function handle(
res: AsyncIterable<permify.grpc.payload.PermissionLookupEntityStreamResponse>
) {
for await (const response of res) {
// response.entityId
}
}
import * as permify from "@permify/permify-node";
const client = new permify.grpc.newClient(
{
endpoint: "localhost:3478",
cert: undefined,
insecure: true,
},
permify.grpc.newAccessTokenInterceptor("YOUR_TOKEN")
);
import * as permify from "@permify/permify-node";
import fs from "fs";
const cert = fs.readFileSync("path/to/cert.pem");
const client = new permify.grpc.newClient(
{
endpoint: "localhost:3478",
cert: cert,
insecure: true,
},
permify.grpc.newAccessTokenInterceptor("YOUR_TOKEN")
);
All API calls return Promises that can be handled with try/catch:
try {
const response = await client.tenancy.create({
id: "t1",
name: "Production Tenant",
});
console.log("Tenant created:", response);
} catch (error) {
console.error("Error creating tenant:", error);
// Handle specific error types
if (error.code === grpc.status.ALREADY_EXISTS) {
console.log("Tenant already exists");
}
}
Contributions are welcome! Please read our contributing guidelines to get started.
If you like Permify, please consider giving us a :star:
FAQs
Permify Node Client
The npm package @permify/permify-node receives a total of 3,000 weekly downloads. As such, @permify/permify-node popularity was classified as popular.
We found that @permify/permify-node demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 3 open source maintainers 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
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.

Security News
TeamPCP is partnering with ransomware group Vect to turn open source supply chain attacks on tools like Trivy and LiteLLM into large-scale ransomware operations.