Skip to content

Commit a52851b

Browse files
authored
Merge branch 'appwrite:main' into what-is-ciam
2 parents 511cd30 + 44db87d commit a52851b

File tree

8 files changed

+342
-6
lines changed

8 files changed

+342
-6
lines changed

src/lib/utils/references.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export const Platform = {
6565

6666
type PlatformType = typeof Platform;
6767
export type Platform = (typeof Platform)[keyof typeof Platform];
68+
export const VALID_PLATFORMS = new Set(Object.values(Platform));
6869

6970
export const Framework = {
7071
NextJs: 'Next.js',
@@ -154,16 +155,27 @@ export const preferredVersion = writable<Version | null>(
154155
globalThis?.localStorage?.getItem('preferredVersion') as Version
155156
);
156157

157-
export const preferredPlatform = writable<Platform>(
158-
(globalThis?.localStorage?.getItem('preferredPlatform') ?? 'client-web') as Platform
159-
);
158+
function getInitialPlatform(): Platform {
159+
const stored = globalThis?.localStorage?.getItem('preferredPlatform') ?? Platform.ClientWeb;
160+
// return if this platform is valid
161+
if (VALID_PLATFORMS.has(stored as Platform)) {
162+
return stored as Platform;
163+
} else {
164+
return Platform.ClientWeb;
165+
}
166+
}
167+
168+
export const preferredPlatform = writable<Platform>(getInitialPlatform());
160169

161170
if (browser) {
162171
preferredVersion.subscribe((value) => {
163172
if (value) globalThis?.localStorage?.setItem('preferredVersion', value);
164173
});
165174

166175
preferredPlatform.subscribe((value) => {
167-
if (value) globalThis?.localStorage?.setItem('preferredPlatform', value);
176+
// only save the ones for which we have api references.
177+
if (value && VALID_PLATFORMS.has(value)) {
178+
globalThis?.localStorage?.setItem('preferredPlatform', value);
179+
}
168180
});
169181
}

src/markdoc/nodes/Heading.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,5 +81,5 @@
8181
class:web-snap-location-references={id && inReferences}
8282
class="{headingClass} text-primary scroll-m-32 font-medium"
8383
>
84-
<a href={`#${href}`} class="">{@render children()}</a>
84+
<a href={`#${id ?? slugify(element?.innerText ?? '')}`} class="">{@render children()}</a>
8585
</svelte:element>
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
---
2+
layout: post
3+
title: "Understanding IdP vs SP-Initiated SSO"
4+
description: A quick guide to IdP vs SP-initiated SSO and when to use each.
5+
date: 2025-06-16
6+
cover: /images/blog/understanding-idp-vs-sp-initiated-sso/cover.png
7+
timeToRead: 06
8+
author: laura-du-ry
9+
callToAction: true
10+
unlisted: true
11+
category: product
12+
---
13+
14+
Managing authentication across multiple applications is a growing challenge for developers, especially with users expecting more convenience and security. Single Sign-On (SSO) offers a practical solution to that problem, allowing users to access multiple services with one login. Although the experience is almost always seamless for users, developers have multiple options for implementing SSO in their applications.
15+
16+
This guide breaks down the differences between **Identity Provider (IdP)-initiated** and **Service Provider (SP)-initiated** SSO, their advantages and trade-offs, and how to choose the best fit for your setup.
17+
18+
# What is IdP-Initiated SSO?
19+
20+
First, a quick refresher: an **Identity Provider (IdP)** manages user identities, validating who a user is before granting access to different applications. Here’s a quick [overview](/docs/products/auth/identities) of how Appwrite handles identity and access.
21+
22+
In an IdP-initiated SSO flow, the user’s journey starts at the IdP itself:
23+
24+
# How it works
25+
26+
1. User logs in to the IdP.
27+
2. The IdP displays a dashboard of connected applications.
28+
3. The user selects a service to access.
29+
4. The IdP sends a secure authentication token (such as a SAML assertion) to the Service Provider (SP).
30+
5. The SP grants access based on the [token](/docs/products/auth/tokens).
31+
32+
# Advantages
33+
34+
- **Streamlined access**: Launch multiple services from a single dashboard.
35+
- **Reduced credential reuse**: Minimizes repeated logins, lowering the risk of compromised credentials.
36+
- **Centralized control**: Simplifies user monitoring and access management.
37+
38+
# Trade-offs
39+
40+
- **Extra navigation step**: Users must first visit the IdP portal.
41+
- **Single point of failure**: If the IdP is compromised, multiple services could be at risk.
42+
- **Integration challenges**: Some services may not fully support IdP-initiated workflows.
43+
44+
{% call_to_action title="Customer identity without the hassle" description="Add secure authentication for your users in just a couple of minutes." point1="GDPR, HIPAA and SOC 2 compliant" point2="Built-in security" point3="Multi-factor authentication" point4="Integrates with your favourite SDK" cta="Contact sales" url="/contact-us/enterprise" /%}
45+
46+
# What is SP-Initiated SSO?
47+
48+
**Service Providers (SPs)** are the applications or services users want to access.
49+
50+
In SP-initiated SSO, the process begins when a user attempts to log into an application directly:
51+
52+
# How it works
53+
54+
1. User tries to access the service.
55+
2. The service detects no active session and redirects the user to the IdP.
56+
3. The user authenticates at the IdP.
57+
4. The IdP sends an authentication token back to the service.
58+
5. The service grants access.
59+
60+
# Advantages
61+
62+
- **Direct access**: Users can go straight to the service they want.
63+
- **Seamless integration**: Fits naturally into user-driven workflows.
64+
- **Flexibility**: Useful for both internal and external users.
65+
66+
# Trade-offs
67+
68+
- **Redirect dependency**: Requires smooth coordination between service and IdP.
69+
- **Increased setup complexity**: Proper configuration is critical to avoid login issues.
70+
71+
# IdP- vs SP-Initiated SSO: Quick Comparison
72+
73+
| Feature | IdP-Initiated SSO | SP-Initiated SSO |
74+
| --- | --- | --- |
75+
| **Starting Point** | Identity Provider portal | Service Provider login page |
76+
| **User Flow** | Login at IdP, then select services | Attempt service access, then authenticate via IdP |
77+
| **User Experience** | Best for environments with multiple services | Best for quick, direct service access |
78+
| **Security Considerations** | Central control but single point of vulnerability | Stronger per-service session security |
79+
| **Typical Use Cases** | Corporate portals, education hubs | SaaS apps, customer-facing platforms |
80+
81+
# When to choose IdP-Initiated SSO
82+
83+
- **Organizations with many internal services**: Ideal for centralized portals.
84+
- **Formal environments**: Where users are accustomed to navigating through a unified dashboard.
85+
- **Legacy system compatibility**: Easier integration with older systems.
86+
87+
# When to Choose SP-Initiated SSO
88+
89+
- **User-first services**: Where users need to quickly access a single app.
90+
- **B2B and B2C platforms**: Especially when users might come in via bookmarks, emails, or direct links.
91+
- **Dynamic environments**: Where new apps are frequently added or removed.
92+
93+
Pro tip: SP-initiated flows are often complemented by [adaptive MFA](/docs/products/auth/mfa) to enhance security without compromising the user experience.
94+
95+
# When to use both approaches
96+
97+
Many organizations implement both IdP- and SP-initiated SSO to serve different user needs:
98+
99+
- **Employee and partner ecosystems**: Employees might use IdP dashboards while partners or customers prefer direct access.
100+
- **Hybrid cloud setups**: Supporting a mix of legacy and modern applications.
101+
- **Adaptive security strategies**: Choosing the flow based on device, location, or user profile.
102+
103+
Choosing the right SSO initiation method,or blending both, can dramatically impact [security](/docs/products/auth/security), user satisfaction, and scalability. Evaluate your platform's user behavior, security posture, and integration needs to pick the best approach for your environment.
104+
105+
# Futher reading
106+
107+
- [Appwrite Authentication docs](/docs/products/auth)
108+
- [Developer's guide to user authentication](/blog/post/guide-to-user-authentication)
109+
- [Appwrite Authentication overview](/products/auth)
110+

src/routes/docs/advanced/platform/+layout.svelte

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@
152152
new: isNewUntil('28 Feb 2025'),
153153
label: 'Abuse',
154154
href: '/docs/advanced/platform/abuse'
155+
},
156+
{
157+
new: isNewUntil('31 July 2025'),
158+
label: 'Support SLA',
159+
href: '/docs/advanced/platform/support-sla'
155160
}
156161
]
157162
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
layout: article
3+
title: Support SLA
4+
description: Learn about Appwrite's support service level agreement (SLA) including response times, severity levels, and support commitments for different subscription tiers.
5+
---
6+
7+
This Support Service Level Agreement ("SLA") describes the support services provided by APPWRITE ("we," "us," or "our") to users of our products and services ("you" or "user"). By using our services, you agree to the terms of this SLA.
8+
9+
## Scope
10+
11+
This SLA outlines our commitments for providing support services via email, including response and resolution processes based on issue severity. The specific response times depend on the support tier associated with your subscription: **Pro**, **Scale**, or **Enterprise**.
12+
13+
## Severity levels
14+
15+
Support issues are categorized into the following severity levels:
16+
17+
- **Critical**: System is down or a critical component is non-functional, causing a complete stoppage of work or significant business impact.
18+
- **High**: Major functionality is impaired, but a workaround is available, or a critical component is significantly degraded.
19+
- **Medium**: Minor functionality is impaired without significant business impact.
20+
- **Low**: Issue has minor impact on business operations; workaround is not necessary.
21+
- **Question**: Requests for information, general guidance, or feature requests.
22+
23+
## Response time targets
24+
25+
| Severity | Pro | Scale | Enterprise |
26+
| --- | --- | --- | --- |
27+
| Critical | Unsupported | 1 hour (24/7/365) | 15 minutes (24/7/365) |
28+
| High | Unsupported | 4 hours (24/7/365) | 1 hour (24/7/365) |
29+
| Medium | 2 business days | 1 business day | 12 hours (24/7/365) |
30+
| Low | 3 business days | 2 business days | 24 hours (24/7/365) |
31+
| Question | 4 business days | 3 business days | 1 business day |
32+
33+
## Business hours and days
34+
35+
Our standard business hours are from **9:00 AM to 5:00 PM Pacific Time**, Monday through Friday, excluding public holidays. Enterprise and Scale customers receive extended support 24/7/365.
36+
37+
## User responsibilities
38+
39+
To ensure effective support, users are expected to:
40+
41+
- Provide detailed information about each issue, including screenshots, error messages, logs, and steps to reproduce the problem.
42+
- Ensure relevant personnel are available to assist in diagnosing and resolving issues.
43+
- Implement reasonable recommendations provided by our support team.
44+
45+
## Limitations and exclusions
46+
47+
- This SLA applies only to support requests submitted via the Appwrite Console.
48+
- SLA obligations may be affected by factors outside our reasonable control, including but not limited to force majeure events, third-party dependencies, or actions taken by the user.
49+
50+
## Modifications
51+
52+
We reserve the right to modify this SLA at any time. Changes become effective upon posting to our website. Your continued use of our services after changes indicates your acceptance of the updated SLA.
53+
54+
For questions or concerns about this SLA, please contact us at our [contact page](https://appwrite.io/contact-us).

0 commit comments

Comments
 (0)