From 153861f8aec54c0732f2b3563dedf87125e768cd Mon Sep 17 00:00:00 2001 From: Vishnu Singh Date: Tue, 22 Jul 2025 18:45:37 +0530 Subject: [PATCH] feat: bootstrap the app with mintlify --- main/docs.json | 211 +++++++++++++ main/docs/articles.mdx | 28 ++ main/docs/artifact-hub.mdx | 238 ++++++++++++++ .../get-started/identity-fundamentals.mdx | 19 ++ .../authentication-and-authorization.mdx | 27 ++ .../identity-and-access-management.mdx | 138 ++++++++ .../introduction-to-auth0.mdx | 95 ++++++ .../quickstart/native/android/interactive.mdx | 295 ++++++++++++++++++ .../quickstart/spa/angular/interactive.mdx | 251 +++++++++++++++ main/docs/quickstarts.mdx | 66 ++++ .../troubleshoot/debugging-best-practices.mdx | 70 +++++ .../error-handling-best-practices.mdx | 57 ++++ main/favicon.svg | 7 + main/images/basic_login_app_background.svg | 9 + main/images/custom_policy_background.png | Bin 0 -> 59379 bytes main/images/logo.png | Bin 0 -> 547 bytes main/images/twilio_background.svg | 28 ++ main/index.mdx | 127 ++++++++ main/ja/docs/articles.mdx | 36 +++ .../get-started/identity-fundamentals.mdx | 21 ++ .../authentication-and-authorization.mdx | 27 ++ .../identity-and-access-management.mdx | 142 +++++++++ .../introduction-to-auth0.mdx | 97 ++++++ .../quickstart/spa/angular/interactive.mdx | 247 +++++++++++++++ main/ja/docs/quickstarts.mdx | 58 ++++ .../troubleshoot/debugging-best-practices.mdx | 71 +++++ .../error-handling-best-practices.mdx | 58 ++++ main/ja/index.mdx | 140 +++++++++ main/logo/dark.svg | 1 + main/logo/light.svg | 1 + 30 files changed, 2565 insertions(+) create mode 100644 main/docs.json create mode 100644 main/docs/articles.mdx create mode 100644 main/docs/artifact-hub.mdx create mode 100644 main/docs/get-started/identity-fundamentals.mdx create mode 100644 main/docs/get-started/identity-fundamentals/authentication-and-authorization.mdx create mode 100644 main/docs/get-started/identity-fundamentals/identity-and-access-management.mdx create mode 100644 main/docs/get-started/identity-fundamentals/introduction-to-auth0.mdx create mode 100644 main/docs/quickstart/native/android/interactive.mdx create mode 100644 main/docs/quickstart/spa/angular/interactive.mdx create mode 100644 main/docs/quickstarts.mdx create mode 100644 main/docs/troubleshoot/debugging-best-practices.mdx create mode 100644 main/docs/troubleshoot/error-handling-best-practices.mdx create mode 100644 main/favicon.svg create mode 100644 main/images/basic_login_app_background.svg create mode 100644 main/images/custom_policy_background.png create mode 100644 main/images/logo.png create mode 100644 main/images/twilio_background.svg create mode 100644 main/index.mdx create mode 100644 main/ja/docs/articles.mdx create mode 100644 main/ja/docs/get-started/identity-fundamentals.mdx create mode 100644 main/ja/docs/get-started/identity-fundamentals/authentication-and-authorization.mdx create mode 100644 main/ja/docs/get-started/identity-fundamentals/identity-and-access-management.mdx create mode 100644 main/ja/docs/get-started/identity-fundamentals/introduction-to-auth0.mdx create mode 100644 main/ja/docs/quickstart/spa/angular/interactive.mdx create mode 100644 main/ja/docs/quickstarts.mdx create mode 100644 main/ja/docs/troubleshoot/debugging-best-practices.mdx create mode 100644 main/ja/docs/troubleshoot/error-handling-best-practices.mdx create mode 100644 main/ja/index.mdx create mode 100644 main/logo/dark.svg create mode 100644 main/logo/light.svg diff --git a/main/docs.json b/main/docs.json new file mode 100644 index 0000000..fd5572e --- /dev/null +++ b/main/docs.json @@ -0,0 +1,211 @@ +{ + "theme": "mint", + "$schema": "https://mintlify.com/docs.json", + "name": "Auth0", + "colors": { + "primary": "#3e58e7", + "light": "#3e58e7", + "dark": "#3e58e7" + }, + "logo": { + "light": "/logo/light.svg", + "dark": "/logo/dark.svg", + "href": "https://auth0.com/" + }, + "favicon": "/favicon.svg", + "appearance": { + "default": "dark" + }, + "background": { + "decoration": "gradient", + "color": { + "dark": "#111111" + } + }, + "navbar": { + "links": [ + { + "label": "Support", + "href": "https://support.auth0.com/?_gl=1*6b4e22*_gcl_au*NDQ2MzUyMjYyLjE3NDU4MjIwNjU.*_ga*MTM1NTI4MjM1Ni4xNzQ1ODIyMDY1*_ga_QKMSDV5369*MTc0NTgzMjY5OC40LjEuMTc0NTgzMzA3Mi4zNS4wLjA." + }, + { + "label": "Sign up", + "href": "https://auth0.com/signup?place=header&type=button&text=sign%20up" + } + ], + "primary": { + "type": "button", + "label": "Contact sales", + "href": "https://auth0.com/contact-us?place=header&type=button&text=contact%20sales" + } + }, + "navigation": { + "global": { + "anchors": [ + { + "anchor": "Help Center", + "icon": "circle-question", + "href": "https://community.auth0.com/c/help/6?_gl=1*6b4e22*_gcl_au*NDQ2MzUyMjYyLjE3NDU4MjIwNjU.*_ga*MTM1NTI4MjM1Ni4xNzQ1ODIyMDY1*_ga_QKMSDV5369*MTc0NTgzMjY5OC40LjEuMTc0NTgzMzA3Mi4zNS4wLjA." + }, + { + "anchor": "Community", + "icon": "users", + "href": "https://community.auth0.com/?_gl=1*1obco81*_gcl_au*NDQ2MzUyMjYyLjE3NDU4MjIwNjU.*_ga*MTM1NTI4MjM1Ni4xNzQ1ODIyMDY1*_ga_QKMSDV5369*MTc0NTgzMjY5OC40LjEuMTc0NTgzMzA2MC40Ny4wLjA." + }, + { + "anchor": "Blog", + "icon": "newspaper", + "href": "https://auth0.com/blog/" + } + ] + }, + "languages": [ + { + "language": "en", + "tabs": [ + { + "tab": "Home", + "pages": [ + "index" + ] + }, + { + "tab": "Articles", + "groups": [ + { + "group": " ", + "pages": [ + "docs/articles" + ] + }, + { + "group": "Get Started", + "pages": [ + { + "group": "Identity Fundamentals", + "pages": [ + "docs/get-started/identity-fundamentals", + "docs/get-started/identity-fundamentals/identity-and-access-management", + "docs/get-started/identity-fundamentals/introduction-to-auth0", + "docs/get-started/identity-fundamentals/authentication-and-authorization" + ] + } + ] + }, + { + "group": "Troubleshoot", + "pages": [ + "docs/troubleshoot/debugging-best-practices", + "docs/troubleshoot/error-handling-best-practices" + ] + }, + { + "group": "Resources", + "pages": [ + "docs/artifact-hub" + ] + } + ] + }, + { + "tab": "Quickstarts", + "groups": [ + { + "group": " ", + "pages": [ + "docs/quickstarts" + ] + }, + { + "group": "Single-page app libraries", + "pages": [ + "docs/quickstart/spa/angular/interactive", + "docs/quickstart/native/android/interactive" + ] + } + ] + } + ] + }, + { + "language": "ja", + "tabs": [ + { + "tab": "Home", + "pages": [ + "ja/index" + ] + }, + { + "tab": "Articles", + "groups": [ + { + "group": " ", + "pages": [ + "ja/docs/articles" + ] + }, + { + "group": "Get Started", + "pages": [ + { + "group": "Identity Fundamentals", + "pages": [ + "ja/docs/get-started/identity-fundamentals", + "ja/docs/get-started/identity-fundamentals/identity-and-access-management", + "ja/docs/get-started/identity-fundamentals/introduction-to-auth0", + "ja/docs/get-started/identity-fundamentals/authentication-and-authorization" + ] + } + ] + }, + { + "group": "Troubleshoot", + "pages": [ + "ja/docs/troubleshoot/debugging-best-practices", + "ja/docs/troubleshoot/error-handling-best-practices" + ] + } + ] + }, + { + "tab": "Quickstarts", + "groups": [ + { + "group": " ", + "pages": [ + "ja/docs/quickstarts" + ] + }, + { + "group": "Single-page app libraries", + "pages": [ + "ja/docs/quickstart/spa/angular/interactive" + ] + } + ] + } + ] + } + ] + }, + "footer": { + "socials": { + "x": "https://twitter.com/auth0", + "linkedin": "https://linkedin.com/company/auth0", + "github": "https://github.com/auth0" + } + }, + "fonts": { + "heading": { + "family": "Aeonik", + "source": "https://cdn.auth0.com/website/cic-homepage/fonts/Aeonik-Regular.woff2", + "format": "woff2" + }, + "body": { + "family": "Aeonik", + "source": "https://cdn.auth0.com/website/cic-homepage/fonts/Aeonik-Regular.woff2", + "format": "woff2" + } + } +} diff --git a/main/docs/articles.mdx b/main/docs/articles.mdx new file mode 100644 index 0000000..7985231 --- /dev/null +++ b/main/docs/articles.mdx @@ -0,0 +1,28 @@ +--- +title: Auth0 Docs +description: "Rely on the Auth0 identity platform to add sophisticated authentication and authorization to your applications. Centralize and manage users from multiple identity providers and give them branded, seamless signup and login experiences. Finely control access with a degree of customization that can accommodate even the most complex security requirements. Easily deploy your implementation and monitor status and services." +sidebarTitle: Home +--- + + + Learn the basics and begin building your authentication solution. + + + Define how your applications and APIs verify the identity of a user or device. + + + Store and manage custom details about your users. + + + Customize Auth0 using your own branding and extend our functionality to solve your unique identity needs. + + + Add multi-factor authentication and defend your application from bots, suspicious IPs, and password breaches. + + + Deploy Auth0 for your applications and monitor system health and events. + + + Troubleshoot challenges, learn about Auth0’s different levels of support, and get help. + + diff --git a/main/docs/artifact-hub.mdx b/main/docs/artifact-hub.mdx new file mode 100644 index 0000000..2b4252f --- /dev/null +++ b/main/docs/artifact-hub.mdx @@ -0,0 +1,238 @@ +--- +title: 'Artifact Hub' +description: 'Enhance your login experience with Auth0 ready to use solutions' +mode: "custom" +--- + +
+
+ +
+

+ Auth0 Artifact Hub +

+

+ Enhance your login experience with Auth0 ready to use solutions +

+ +
+
+ +
+ + + +
+
+
+
+
+ +
+
+

Browse by resource type

+ +
+
+
+

Templates

+

Pre-built solutions to boost your implementation workflow.

+
+
+ +
+
+

Sample Apps

+

Fully functional end-to-end user flows.

+
+
+ +
+
+

Integrations

+

Connect Auth0 with your existing tools and services.

+
+
+
+
+ +
+

Most used resources

+ +
+
+
+
+ Custom Policies Acceptance +
+

CUSTOM POLICIES ACCEPTANCE

+

+ Require your users to accept custom policies the next time they sign in or when they create an account +

+
+
+ TEMPLATE + FORMS +
+
+
+ Auth0 Logo + Auth0 Logo +
+
+ + + + 20' +
+
+
+
+
+ +
+
+
+ Basic Login for WebApp +
+

BASIC LOGIN FOR WEBAPP

+

+ Implement a simple Universal Login to secure your website with minimal setup. +

+
+
+ SAMPLE APP + UNIVERSAL LOGIN +
+
+
+ Auth0 Logo + Auth0 Logo +
+
+ + + + 20' +
+
+
+
+
+ +
+
+
+ Twilio Verify +
+

TWILIO VERIFY

+

+ SMS-based multifactor authentication to strengthen login security. +

+
+
+ INTEGRATION + SMS PROVIDER +
+
+
+ Auth0 Logo + Auth0 Logo +
+
+ + + + 20' +
+
+
+
+
+
+
+ +
+

Features

+ +
+ +
+

+ + + + Ready-to-use solutions +

+

+ Quickly implement authentication with pre-built components and templates. +

+
+
+ + +
+

+ + + + Customizable +

+

+ Adapt artifacts to match your brand identity and specific requirements. +

+
+
+ + +
+

+ + + + Secure by default +

+

+ All artifacts follow security best practices and are regularly updated. +

+
+
+ + +
+

+ + + + Community-driven +

+

+ Benefit from contributions by the Auth0 community and share your own. +

+
+
+
+
+
diff --git a/main/docs/get-started/identity-fundamentals.mdx b/main/docs/get-started/identity-fundamentals.mdx new file mode 100644 index 0000000..33f3b02 --- /dev/null +++ b/main/docs/get-started/identity-fundamentals.mdx @@ -0,0 +1,19 @@ +--- +title: Identity Fundamentals +description: "Explore topics related to the fundamentals of identity and access management." +sidebarTitle: Overview +--- + +Explore topics related to the fundamentals of identity and access management. + + + + Basic concepts of IAM. + + + About the differences between authentication and authorization. + + + Definitions of various terms related to identity. + + diff --git a/main/docs/get-started/identity-fundamentals/authentication-and-authorization.mdx b/main/docs/get-started/identity-fundamentals/authentication-and-authorization.mdx new file mode 100644 index 0000000..5f03193 --- /dev/null +++ b/main/docs/get-started/identity-fundamentals/authentication-and-authorization.mdx @@ -0,0 +1,27 @@ +--- +title: Authentication vs. Authorization +description: "While often used interchangeably, [authentication](https://auth0.com/docs/authenticate) and authorization represent fundamentally different functions. In this article, we compare and contrast the two to show how they protect applications in complementary ways." +--- + +## What are authentication and authorization? + +In simple terms, authentication is the process of verifying who a user is, while authorization is the process of verifying what they have access to. + +Comparing these processes to a real-world example, when you go through security in an airport, you show your ID to authenticate your identity. Then, when you arrive at the gate, you present your boarding pass to the flight attendant, so they can authorize you to board your flight and allow access to the plane. + +## Authentication vs. authorization + +Here's a quick overview of the differences between authentication and authorization: + +| **Authentication** | **Authorization** | +| --- | --- | +| Determines whether users are who they claim to be | Determines what users can and cannot access | +| Challenges the user to validate credentials (for example, through passwords, answers to security questions, or facial recognition) | Verifies whether access is allowed through policies and rules | +| Usually done before authorization | Usually done after successful authentication | +| Generally, transmits info through an ID Token | Generally, transmits info through an Access Token | +| Generally governed by the OpenID Connect (OIDC) protocol | Generally governed by the OAuth 2.0 framework | +| Example: Employees in a company are required to authenticate through the network before accessing their company email | Example: After an employee successfully authenticates, the system determines what information the employees are allowed to access | + +In short, access to a resource is protected by both authentication and authorization. If you can't prove your identity, you won't be allowed into a resource. And even if you can prove your identity, if you are not authorized for that resource, you will still be denied access. + +Auth0 has products and services for authentication, like [passwordless](https://auth0.com/docs/authenticate/passwordless/passwordless-with-universal-login), [multi-factor authentication](https://auth0.com/docs/secure/multi-factor-authentication) (MFA), and [Single-Sign On (SSO)](https://auth0.com/docs/authenticate/single-sign-on) you can configure using Auth0 Dashboard or Management API. For authorization, Auth0 offers [role-based access control](https://auth0.com/docs/manage-users/access-control/rbac) (RBAC) or [fine grained authorization](https://docs.fga.dev/fga) FGA). diff --git a/main/docs/get-started/identity-fundamentals/identity-and-access-management.mdx b/main/docs/get-started/identity-fundamentals/identity-and-access-management.mdx new file mode 100644 index 0000000..2411b06 --- /dev/null +++ b/main/docs/get-started/identity-fundamentals/identity-and-access-management.mdx @@ -0,0 +1,138 @@ +--- +title: Introduction to Identity & Access Management (IAM) +--- + +## What is identity and access management (IAM)?  + +Identity and access management provides control over user validation and resource access. Commonly known as IAM, this technology ensures that the right people access the right digital resources at the right time and for the right reasons. + +## IAM basic concepts + +To understand IAM, you must be familiar with some fundamental concepts: + +- A **digital resource** is any combination of applications and data in a computer system. Examples of digital resources include web applications, APIs, platforms, devices, or databases. +- The core of IAM is **identity**. Someone wants access to your resource. It could be a customer, employee, member, participant, and so on. In IAM, a **user** account is a digital identity. User accounts can also represent non-humans, such as software, Internet of Things devices, or robotics. + + + +
+ + + +- **Authentication** is the verification of a digital identity. Someone (or something) authenticates to prove that they’re the user they claim to be. +- **Authorization** is the process of determining what resources a user can access. + +## The difference between authentication and authorization + +It’s common to confuse authentication and authorization because they seem like a single experience to users. They are two separate processes: authentication proves a user’s identity, while authorization grants or denies the user’s access to certain resources.  + +You can think of authentication and authorization as the security system for an office building. Users are the people who want to enter the building. Resources that people want to access are areas in the building: floors, rooms, and so on.  + +**Authentication:** When you enter the building, you must show your photo ID badge to the security guard. The guard compares the photo on the badge to your face. If they match, the guard lets you through the door to try to access different areas of the building. The guard doesn’t tell you what rooms you can access; they only get proof that you are who you claim to be. This is authentication: confirming user identity.  + + + + + +**Authorization:** In this scenario, imagine the elevators and doorways in the building have key sensors for access. The chip in your badge gives you access only to the first floor, which your company occupies. If you swipe your badge to enter any other floor, your access is denied. You can access your private office but not those belonging to your colleagues. You can enter the supply room but not the server room. This is authorization: granting and denying access to different resources based on identity.  + + + + + +To learn more about authentication and authorization, read [Authentication vs. Authorization](https://auth0.com/docs/get-started/identity-fundamentals/authentication-and-authorization). + +## What does IAM do? + +Identity and access management gives you control over user validation and resource access:  + +- How users become a part of your system +- What user information to store +- How users can prove their identity +- When and how often users must prove their identity +- The experience of proving identity +- Who can and cannot access different resources + +You integrate IAM with your application, API, device, data store, or other technology. This integration can be very simple. For example, your web application might rely entirely on Facebook for authentication, and have an all-or-nothing authorization policy. Your app performs a simple check: if a user isn’t currently logged in to Facebook in the current browser, you direct them to do so. Once authenticated, all users can access everything in your app.  + +It’s unlikely that such a simple IAM solution would meet the needs of your users, organization, industry, or compliance standards. In real life, IAM is complex. Most systems require some combination of these capabilities: + +- **Seamless signup and login experiences:** Smooth and professional login and signup experiences occur within your app, with your brand’s look and language. +- **Multiple sources of user identities:** Users expect to be able to log in using a variety of social (such as Google or Linkedin), enterprise (such as Microsoft Active Directory), and other [identity providers](https://auth0.com/docs/authenticate/identity-providers). +- **Multi-factor authentication (MFA):** In an age when passwords are often stolen, requiring additional proof of identity is the new standard. Fingerprint authentication and one-time passwords are examples of common authentication methods. To learn more, read [Multi-Factor Authentication (MFA)](https://auth0.com/docs/secure/multi-factor-authentication). +- **Step-up authentication:** Access to advanced capabilities and sensitive information require stronger proof of identity than everyday tasks and data. Step-up authentication requires additional identity verification for selected areas and features. To learn more, read [Add Step-up Authentication](https://auth0.com/docs/secure/multi-factor-authentication/step-up-authentication). +- **Attack protection:** Preventing bots and bad actors from breaking into your system is fundamental to cybersecurity. To learn more, read [Attack Protection](https://auth0.com/docs/secure/attack-protection). +- **Role-based access control (RBAC):** As the number of users grows, managing the access of each individual quickly becomes impractical. With RBAC, people who have the same role have the same access to resources. To learn more, read [Role-Based Access Control](https://auth0.com/docs/manage-users/access-control/rbac). +- **Fine-grained authorization (FGA):** When you need more options to manage user access to your resources or technologies, you can use relationship-based access control to go beyond role-based. You can give individual users access to certain resources and determine the best solution for your specific use case. To learn more, read [What Is Fine-Grained Authorization?](https://docs.fga.dev/intro/authorization-and-okta-fga#what-is-fine-grained-authorization) + +Facing this level of complexity, many developers rely on an IAM platform like Auth0 instead of building their own solutions.  + +## How does IAM work?  + +“Identity and access management” is not one clearly defined system. IAM is a discipline and a type of framework for solving the challenge of secure access to digital resources.  There’s no limit to the different approaches for implementing an IAM system. This section explores elements and practices in common implementations.  + +### Identity providers + +In the past, the standard for identity and access management was for a system to create and manage its own identity information for its users. Each time a user wanted to use a new web application, they filled in a form to create an account. The application stored all of their information, including login credentials, and performed its own authentication whenever a user signed in.  + +As the internet grew and more and more applications became available, most people amassed countless user accounts, each with its own account name and password to remember. There are many applications that continue to work this way. But many others now rely on identity providers to reduce their development and maintenance burden and their users’ effort. + +An identity provider creates, maintains, and manages identity information, and can provide authentication services to other applications. For example, Google Accounts is an identity provider. They store account information such as your user name, full name, job title, and email address. Slate online magazine lets you log in with Google (or another identity provider) rather than go through the steps of entering and storing your information anew.  + + + + + +Identity providers don’t share your authentication credentials with the apps that rely on them. Slate, for example, doesn’t ever see your Google password. Google only lets Slate know that you’ve proven your identity.  + +Other identity providers include social media (such as Facebook or LinkedIn), enterprise (such as Microsoft Active Directory), and legal identity providers (such as Swedish BankID). + +### Authentication factors + +Authentication factors are methods for proving a user’s identity. They commonly fall into these basic types: + +| Factor type | Examples | +| --- | --- | +| Knowledge (something you know) | Pin, password | +| Possession (something you have) | Mobile phone, encryption key device | +| Inherence (something you are) | Fingerprint, facial recognition, iris scan | + +IAM systems require one or many authentication factors to verify identity. + +### Authentication and authorization standards + +Authentication and authorization standards are open specifications and protocols that provide guidance on how to: + +- Design IAM systems to manage identity +- Move personal data securely +- Decide who can access resources + +These IAM industry standards are considered the most secure, reliable, and practical to implement: + +#### OAuth 2.0 + +OAuth 2.0 is a delegation protocol for accessing APIs and is the industry-standard protocol for IAM. An open authorization protocol, OAuth 2.0 lets an app access resources hosted by other web apps on behalf of a user without ever sharing the user’s credentials. It’s the standard that allows third-party developers to rely on large social platforms like Facebook, Google, and Twitter for login. To learn more, read [OAuth 2.0 Authorization Framework](https://auth0.com/docs/authenticate/protocols/oauth). + +#### Open ID Connect + +A simple identity layer that sits on top of OAuth 2.0, OpenID Connect (OIDC) makes it easy to verify a user’s identity and obtain basic profile information from the identity provider. OIDC is another open standard protocol. To learn more, read [OpenID Connect Protocol](https://auth0.com/docs/authenticate/protocols/openid-connect-protocol). + +#### JSON web tokens + +JSON web tokens (JWTs) are an open standard that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. JWTs can be verified and trusted because they’re digitally signed. They can be used to pass the identity of authenticated users between the identity provider and the service requesting the authentication. They also can be authenticated and encrypted. To learn more, read [JSON Web Tokens](https://auth0.com/docs/secure/tokens/json-web-tokens). + +#### Security Assertion Markup Language (SAML) + +Security Assertion Markup Language (SAML) is an open-standard, XML-based data format that lets businesses communicate user authentication and authorization information to partner companies and enterprise applications that their employees use. To learn more, read [SAML](https://auth0.com/docs/authenticate/protocols/saml). + +#### Web Services Federation (WS-Fed) + +Developed by Microsoft and used extensively in their applications, this standard defines the way security tokens can be transported between different entities to exchange identity and authorization information. To learn more, read [Web Services Federation Protocol](https://auth0.com/docs/authenticate/protocols/ws-fed-protocol). + +## Why use an IAM platform? + +Why do so many developers choose to build on an identity and access management platform instead of building their own solution from the ground up? + +User expectations, customer requirements, and compliance standards introduce significant technical challenges. With multiple user sources, authentication factors, and open industry standards, the amount of knowledge and work required to build a typical IAM system can be enormous. A strong IAM platform has built-in support for all identity providers and authentication factors, offers APIs for easy integration with your software, and relies on the most secure industry standards for authentication and authorization. + +For those who haven’t yet decided whether to build or buy an IAM solution, [Build vs. Buy: Guide to Evaluating Identity Management](https://auth0.com/resources/whitepapers/build-vs-buy-evaluating-identity-management) is a useful resource. diff --git a/main/docs/get-started/identity-fundamentals/introduction-to-auth0.mdx b/main/docs/get-started/identity-fundamentals/introduction-to-auth0.mdx new file mode 100644 index 0000000..5c82591 --- /dev/null +++ b/main/docs/get-started/identity-fundamentals/introduction-to-auth0.mdx @@ -0,0 +1,95 @@ +--- +title: Introduction to Auth0 +description: "Auth0 is an identity access management (IAM) provider. But what does this mean? If you've read [Introduction to Identity and Access Management (IAM)](https://auth0.com/docs/get-started/identity-fundamentals/identity-and-access-management), you know an IAM solution is a gatekeeper to the resources you provide to customers as web applications, APIs, etc." +--- + +The gatekeeper initiates authorization as outlined in OAuth 2.0. The addition of the OpenID Connect layer adds authentication to secure your users’ digital identities and your product. + +The Auth0 identity platform supports different application types and frameworks. Whether your application is a regular web app, a mobile app, or a machine-to-machine app, Auth0 provides configurations for the most secure authorization grant, or workflow, for each. You can read more about authorization grants and choose the one for your application in our article [Which OAuth 2.0 Flow Should I Use?](https://auth0.com/docs/get-started/authentication-and-authorization-flow/which-oauth-2-0-flow-should-i-use) + +Aside from supporting secure protocols, the Auth0 identity platform allows you to customize login services to fit your business, your technology, and your customer base. Using the Auth0 Dashboard and Management API, you can create your own Auth0 instance to authenticate and authorize your customers. You can configure login behaviors, connect your user data store, manage those users, choose an authorization grant, and establish authentication factors for a seamless, scalable product with an impactful user experience. + +## Get Started + +### Identity fundamentals + +You don’t have to be an expert on IAM to integrate Auth0 into your application or API, but you can choose the right configuration for your use case if you know some key concepts. To learn more, read our [Introduction to Identity and Access Management (IAM)](https://auth0.com/docs/get-started/identity-fundamentals/identity-and-access-management) article. If you still have questions about planning your implementation, review our [Architecture Scenarios](https://auth0.com/docs/get-started/architecture-scenarios) section for walk-throughs of real world scenarios. + +### Integrate with Auth0 + +To start integrating with Auth0, you can either start with our interactive [Quickstart guides](https://auth0.com/docs/quickstarts) for initial set-up and quick configurations, or you can register your application manually in the Auth0 Dashboard. In Dashboard, you can create a tenant, or your Auth0 instance, from the ground up. If you prefer to use SDKs, Auth0 offers multiple options for each application type. To see the full offering, navigate to [Auth0 Libraries](https://auth0.com/docs/libraries). + +You can begin your configuration with general details in the Dashboard tenant settings, such as the name displayed to your users, your company logo, your callback URLs, or where Auth0 redirects your users after authentication. You can review our recommendations by reading [Tenant Settings](https://auth0.com/docs/get-started/tenant-settings). + +Once you’ve set up the tenant, then you can create and configure your application or API. You can use the instructions in our articles [Create Applications](https://auth0.com/docs/get-started/auth0-overview/create-applications) or [Register APIs](https://auth0.com/docs/get-started/auth0-overview/set-up-apis) as a starting point. + +### Authenticate + +The vehicle of authentication is the login form, or the intermediary to allow your users access to your application. Users provide pre-determined credentials, such as username or password, in the login form to verify their digital identities. + +Auth0’s Universal Login is a login form you can customize to accommodate your brand and configure to provide secure access. Some benefits of using Universal Login are: + +- Passwordless login with biometrics +- Choice of multi-factor authentication methods from email, voice, or Duo +- Single Sign-on (SSO) capabilities +- Localization support + +To learn more, read [Universal Login](https://auth0.com/docs/authenticate/login/auth0-universal-login). To find out more about available features, read [Universal Login vs. Classic Login](https://auth0.com/docs/authenticate/login/auth0-universal-login/universal-login-vs-classic-login). + +Once you have a login form, you can connect your user store to Auth0. You can connect an existing database, or use a social, legal, or enterprise identity provider such as X or Azure Active Directory. New users can sign up with the connection you have configured. + +Once you have a login form and user store connection, you can set protocols that work behind the scenes when users log in to your application. The most common protocols are associated with the OAuth 2.0 and OpenID Connect (OIDC) specs you may have reviewed in our [Identity Fundamentals](https://auth0.com/docs/get-started/identity-fundamentals) article. + +Another protocol to securely transmit information during log in comes in the form of tokens. Tokens from the Authorization Server, Auth0’s Authentication API, transmit information between entities.  When a user logs in and access is approved, the Authentication API sends an access token, an ID token, or both depending on the authentication grant you are using to create a session. Access tokens contain information about what scopes, or permissions, the requestor has in your application while ID tokens have requestor information, such as user metadata to better the user experience. + +Tokens from the Authentication API are JSON Web Tokens (JWTs) structured with: + +- a header that includes the signature +- the payload that contains statements and attributes about the requestor +- the signature that verifies the token is valid + +To learn more about tokens, read [Access Tokens](https://auth0.com/docs/secure/tokens/access-tokens), [ID Tokens](https://auth0.com/docs/secure/tokens/id-tokens), or [JSON Web Tokens](https://auth0.com/docs/secure/tokens/json-web-tokens). + +Other protocols, like SAML (Security Assertion Markup Language) and WS-Fed (Web Service Federation) are used with more specific systems. SAML works with some identity providers while WS-Fed is used with Microsoft products. You can learn more by exploring the [Protocols](https://auth0.com/docs/authenticate/protocols) section of our documentation. + +### Manage users + +Managing user profiles and access can be time-consuming. If you choose to manage users with your Auth0 instance, you can remove some of the pain points. + +You can easily automate CRUD operations and query user profiles using Auth0 Dashboard or the Management API. You can categorize your users into categories with Auth0 Organizations to arrange your customer-base to fit your management style. To learn more, navigate to the [Manage Users](https://auth0.com/docs/manage-users) section of our documentation. + +Your business model may include levels of access for your users. You may want a subsection of users to have read-only permissions and another subsection with the ability to edit. Auth0’s Authorization Core allows you to implement role-based access control. You can create roles, assign roles to users, and define permissions. + +If you want to manage access based on browser behaviors, you can limit the lifetime of a session. A session, or the interaction between the requesting entity and your application or resource, has a lifetime limit. A session can end when the user closes the browser or navigates away from your webpage. You can extend sessions with refresh tokens that renew access tokens. Configure refresh tokens in the Dashboard.  To learn more, read [Session Lifetime Limits](https://auth0.com/docs/manage-users/sessions/session-lifetime-limits) and [Get Refresh Tokens](https://auth0.com/docs/secure/tokens/refresh-tokens/get-refresh-tokens). + +Cookies, or strings of data, tie into the session and represent an authenticated user. Cookies allow your authenticated users to maintain a session and move between web pages without being forced to re-authenticate.  Once the browser closes, the cookie is cleared by the browser. + +### Customize + +Your brand is important, and Auth0 offers customization to make the login experience more personalized to your business. You can add your logo and color scheme to your login form as well as use a custom domain to give you ownership of the login URL. To learn more about configuration, read [Custom Domains](https://auth0.com/docs/customize/custom-domains). + +Universal Login offers numerous features to configure authentication to fit your needs, like Multi-factor authentication, passwordless authentication with device biometrics, and localization. On a more granular level, you can adjust the text of prompts your user receives when an action needs to be completed. You can configure prompts for your users to signup, to enroll a device for authentication, or to send a code to an email/SMS for users to enter for verification. You can also customize email communications to welcome new users, verify enrollment, or reset passwords with email templates. To learn more, read [Customize Universal Login Text Elements](https://auth0.com/docs/customize/login-pages/universal-login/customize-text-elements) and [Customize Email Templates](https://auth0.com/docs/customize/email/email-templates). + +You can also configure certain events with Auth0 Actions. Actions are secure functions that execute during runtime. Actions trigger at different points in the pipeline and have a variety of uses. You could add metadata before the user signs up or redirect users to an external site. To learn more about what Actions can do for you, read [Understand How Auth0 Actions Work](https://auth0.com/docs/customize/actions/actions-overview). + +### Secure + +Malicious attacks can happen anytime. Auth0 offers several attack protection options, such as Bot Detection in combination with Google reCAPTCHA Enterprise to prevent cyber attacks. To learn more about Bot Detection configuration, read [Bot Detection](https://auth0.com/docs/secure/attack-protection/bot-detection).  + +Even if you are using your own login page, Auth0 offers other security options you can enable in the Auth0 Dashboard:  + +- Breached Password Detection +- Brute-Force Protection +- Suspicious IP Throttling + +Breached password detection is a security measure against malicious agents with stolen credentials. Brute-force protection safeguards a targeted user account by limiting the amount of login attempts that automatically block the malicious IP and send a notification to the flagged user account. Suspicious IP throttling works where brute force protection leaves off to block traffic from any IP address that attempts rapid signups or logins. + +Other security measures depend on how you want your users to authenticate. Enabling multi-factor authentication (MFA) in Universal Login requires users to provide two or more authentication factors. With Auth0, you can customize MFA to trigger under certain circumstances, such as a user logging in from an unknown device or from a questionable IP address. To learn more about configuring MFA, read [Adaptive MFA](https://auth0.com/docs/secure/multi-factor-authentication/adaptive-mfa). + +### Deploy and monitor + +When you’ve finished testing your Auth0 instance and are ready to deploy, you can use our public or private cloud offerings. To learn more about available offerings, read [Deployment Options](https://auth0.com/docs/deploy-monitor/deployment-options). If you need a multi-tenant capable environment, you can read more about [Private Cloud on AWS](https://auth0.com/docs/deploy-monitor/deploy-private-cloud/private-cloud-on-aws). + +To keep your deployment on track, we provide guidance in the form of pre-deployment recommendations, a deployment checklist, best practices, common fixes, and other tips to help make deployment as seamless as possible. + +Once you’ve established your production environment ready for users, you can be on the lookout with error tracking and alerts. The System Center Operations Manager allows you to monitor, while event logs can be exported to an analytical tool and allow you insight on trends, user behavior, or issues. diff --git a/main/docs/quickstart/native/android/interactive.mdx b/main/docs/quickstart/native/android/interactive.mdx new file mode 100644 index 0000000..d9b0381 --- /dev/null +++ b/main/docs/quickstart/native/android/interactive.mdx @@ -0,0 +1,295 @@ +--- +title: Add Login to Your Android Application +--- + + + + +To use Auth0 services, you need to have an application set up in the Auth0 Dashboard. The Auth0 application is where you will configure authentication in your project. + +### Configure an application + +Use the interactive selector to create a new Auth0 application or select an existing application that represents the project you want to integrate with. Every application in Auth0 is assigned an alphanumeric, unique client ID that your application code will use to call Auth0 APIs through the SDK. + +Any settings you configure using this quickstart will automatically update for your Application in the [Dashboard](https://manage.auth0.com/#/), which is where you can manage your Applications in the future. + +If you would rather explore a complete configuration, you can view a sample application instead. + +### Configure Callback URLs + +A callback URL is the application URL that Auth0 will direct your users to once they have authenticated. If you do not set this value, Auth0 will not return users to your application after they log in. + + + If you are following along with our sample project, set this to demo:// + {yourDomain}/android/YOUR_APP_PACKAGE_NAME/callback. + + +### Configure logout URLs + +A logout URL is the application URL Auth0 will redirect your users to once they log out. If you do not set this value, users will not be able to log out from your application and will receive an error. + + + If you are following along with our sample project, set this to demo:// + {yourDomain}/android/YOUR_APP_PACKAGE_NAME/callback + + + + + +Add the Auth0 [Android SDK](https://github.com/auth0/Auth0.Android) into your project. The library will make requests to the Auth0's Authentication and Management APIs. + +In your app's build.gradle dependencies section, add the following: +``` java +implementation 'com.auth0.android:auth0:2.+' +``` + +Ensure you target Java 8+ byte code for Android and Kotlin plugins respectively. + + + + + +The SDK requires manifest placeholders. Auth0 uses placeholders internally to define an `intent-filter`, which captures the authentication callback URL. You must set Auth0 tenant domain and the callback URL scheme. + +You do not need to declare a specific `intent-filter` for your activity, because you have defined the manifest placeholders with your Auth0 Domain and Scheme values and the library will handle the redirection for you. + + + We've used a value of `**bold**demo**bold**` for `**bold**auth0Scheme**bold**` + here, so that a custom URL scheme can be used for the URL that Auth0 redirects + to after login. Whenever possible, Auth0 recommends using [Android App + Links](https://auth0.com/docs/applications/enable-android-app-links) with + `**bold**https**bold**` as a secure way to link directly to content within + your app. Custom URL schemes can be subject to [client impersonation + attacks](https://datatracker.ietf.org/doc/html/rfc8252#section-8.6). You can + read more about setting this value in the [Auth0.Android SDK + readme](https://github.com/auth0/Auth0.Android#a-note-about-app-deep-linking). + + + + + + +For the SDK to function properly, you must set the following properties in `strings.xml`: + +- `com_auth0_domain`: The domain of your Auth0 tenant. Generally, you can find this in the Auth0 Dashboard under your Application's Settings in the Domain field. If you are using a [custom domain](https://auth0.com/docs/custom-domains), you should set this to the value of your custom domain instead. + +- `com_auth0_client_id`: The ID of the Auth0 Application you set up earlier in this quickstart. You can find this in the Auth0 Dashboard under your Application's Settings in the Client ID field. + +Ensure that the `AndroidManifest.xml` file specifies the `android.permissions.INTERNET` permission: + +``` + +``` + +Run **bold**Sync Project with Gradle Files**bold** inside Android Studio or execute `./gradlew clean assembleDebug` from the command line. + + + For more information about using Gradle, check the [Gradle official + documentation](https://gradle.org/getting-started-android-build/). + + + + + + +[Universal Login](https://auth0.com/docs/hosted-pages/login) is the easiest way to set up authentication in your application. We recommend using it for the best experience, best security and the fullest array of features. + +In the `onCreate` method, create a new instance of the `Auth0` class to hold user credentials. + +Create a `loginWithBrowser` method and use the `WebAuthProvider` class to authenticate with any connection you enabled on your application in the [Auth0 dashboard](https://manage.auth0.com/?_gl=1*1yaym9q*_gcl_au*MTQ2MzA2MzY4Ny4xNzQ2NTExNjgy*_ga*MTg2NDk1NzgyMy4xNzQ2NTExNjk3*_ga_QKMSDV5369*czE3NDY1MjA0NjEkbzIkZzEkdDE3NDY1MjI0NzYkajYwJGwwJGgw#/). Here, you can pass the scheme value that was used in the `auth0Scheme` manifest placeholder as part of the initial configuration. + +After you call the `WebAuthProvider#start` function, the browser launches and shows the login page. Once the user authenticates, the callback URL is called. The callback URL contains the final result of the authentication process. + + +##### Checkpoint +Add a button to your application that calls `loginWithBrowser`. When you click it, verify that your Android application redirects you to the [Auth0 Universal Login](https://auth0.com/universal-login) page and that you can now log in or sign up using a username and password or a social provider. + +Once that's complete, verify that Auth0 redirects back to your app. + + + +- `com_auth0_domain`: The domain of your Auth0 tenant. Generally, you can find this in the Auth0 Dashboard under your Application's Settings in the Domain field. If you are using a [custom domain](https://auth0.com/docs/custom-domains), you should set this to the value of your custom domain instead. +- `com_auth0_client_id`: The ID of the Auth0 Application you set up earlier in this quickstart. You can find this in the Auth0 Dashboard under your Application's Settings in the Client ID field. + +Ensure that the `AndroidManifest.xml` file specifies the `android.permissions.INTERNET` permission: + +``` + +``` + +Run **bold**Sync Project with Gradle Files**bold** inside Android Studio or execute `./gradlew clean assembleDebug` from the command line. + + +For more information about using Gradle, check the [Gradle official documentation](https://gradle.org/getting-started-android-build/) + + + + + +Use `WebAuthProvider` to remove the cookie set by the browser at authentication time, so that the users are forced to re-enter their credentials the next time they try to authenticate. + +Add a `logout` method to your app to remove the user's session and log them out of the app. Here, you can pass the scheme value that was used in the `auth0Scheme` manifest placeholder as part of the initial configuration. + +Use the `WebAuthProvider` class to implement logout. This call opens the browser and navigates the user to the logout endpoint. If the user cancels the logout, consider redirected the user to their previous URL. + + +##### Checkpoint + +Add a button to your app that calls `logout` and logs the user out of your application. When you click it, verify that your Android app redirects you logout page and back again, and that you are no longer logged in to your application. + + + + + + + +Use the `AuthenticationAPIClient` class to [retrieve the user's profile from Auth0](https://auth0.com/docs/users/user-profiles#user-profile-management-api-access). This requires: + +- The access token returned from the login phase +- The `WebAuthProvider.login` must contain the `profile` scope + +You must specify the `email` scope if you need to retrieve the user's email address. + + + This quickstart sets the `openid profile email` scopes by default during the + login step above. + + +The following demonstrates a function that can be used to retrieve the user's profile and show it on the screen: + + + +##### Checkpoint + +Call the `showUserProfile` function after login. Verify the `onSuccess` callback returns the user's profile information. + + + + + + +## Next Steps" + +Excellent work! If you made it this far, you should now have login, logout, and user profile information running in your application. + +This concludes our quickstart tutorial, but there is so much more to explore. To learn more about what you can do with Auth0, check out: + + + + Learn how to configure and manage your Auth0 tenant and applications + + + Explore the SDK used in this tutorial more fully + + + Discover integrations you can enable to extend Auth0’s functionality + + + + +```java build.gradle +apply plugin: 'com.android.application' + +android { + defaultConfig { + applicationId "com.auth0.samples" + minSdkVersion 21 + targetSdkVersion 30 + // ... + + // ---> Add the next line + manifestPlaceholders = [auth0Domain: "@string/com_auth0_domain", auth0Scheme: "demo"] + // <--- + } + +} + +dependencies { + // Add the Auth0 Android SDK + implementation 'com.auth0.android:auth0:2.+' +} + +```` +```xml strings.xml + + "{yourDomain}" + "{yourClientId}" + +```` + +```java MainActivity.kt +import com.auth0.android.Auth0 +import com.auth0.android.provider.WebAuthProvider + +class MainActivity: AppCompatActivity() { + + private lateinit + var account: Auth0 + + override fun onCreate(savedInstanceState: Bundle ? ) { + super.onCreate(savedInstanceState) + + // Set up the account object with the Auth0 application details + account = Auth0( + getString(R.string.com_auth0_client_id), + getString(R.string.com_auth0_domain), + ) + } + + private fun loginWithBrowser() { + // Setup the WebAuthProvider, using the custom scheme and scope. + + WebAuthProvider.login(account) + .withScheme("demo") + .withScope("openid profile email") + // Launch the authentication passing the callback where the results will be received + .start(this, object: Callback < Credentials, AuthenticationException > { + // Called when there is an authentication failure + override fun onFailure(exception: AuthenticationException) { + // Something went wrong! + } + + // Called when authentication completed successfully + override fun onSuccess(credentials: Credentials) { + // Get the access token from the credentials object. + // This can be used to call APIs + val accessToken = credentials.accessToken + } + }) + } + + private fun logout() { + WebAuthProvider.logout(account) + .withScheme("demo") + .start(this, object: Callback < Void ? , AuthenticationException > { + override fun onSuccess(payload: Void ? ) { + // The user has been logged out! + } + + override fun onFailure(error: AuthenticationException) { + // Something went wrong! + } + }) + } + + private fun showUserProfile(accessToken: String) { + var client = AuthenticationAPIClient(account) + + // With the access token, call `userInfo` and get the profile from Auth0. + client.userInfo(accessToken) + .start(object: Callback < UserProfile, AuthenticationException > { + override fun onFailure(exception: AuthenticationException) { + // Something went wrong! + } + + override fun onSuccess(profile: UserProfile) { + // We have the user's profile! + val email = profile.email + val name = profile.name + } + }) + } +} +``` + + diff --git a/main/docs/quickstart/spa/angular/interactive.mdx b/main/docs/quickstart/spa/angular/interactive.mdx new file mode 100644 index 0000000..4a5c91c --- /dev/null +++ b/main/docs/quickstart/spa/angular/interactive.mdx @@ -0,0 +1,251 @@ +--- +title: Add Login to Your Angular Application +--- + + + Visit the [Angular Authentication By Example](https://developer.auth0.com/resources/guides/spa/angular/basic-authentication) guide for a deep dive into implementing user authentication in Angular. This guide provides additional details on how to create a sign-up button, add route guards, and call a protected API from Angular. + + +Auth0 allows you to add authentication to almost any application type quickly. This guide demonstrates how to integrate Auth0, add authentication, and display user profile information in any Angular application using the [Auth0 Angular SDK](https://github.com/auth0/auth0-angular). + +To use this quickstart, you’ll need to: + +- Sign up for a free Auth0 account or log in to Auth0. +- Have a working Angular project that you want to integrate with. Alternatively, you can view or download a sample application after logging in. + + + + +To use Auth0 services, you’ll need to have an application set up in the Auth0 Dashboard. The Auth0 application is where you will configure how you want authentication to work for the project you are developing. + +### Configure an application + +Use the interactive selector to create a new Auth0 application or select an existing application that represents the project you want to integrate with. Every application in Auth0 is assigned an alphanumeric, unique client ID that your application code will use to call Auth0 APIs through the SDK. + +Any settings you configure using this quickstart will automatically update for your Application in the [Dashboard](https://manage.auth0.com/#/), which is where you can manage your Applications in the future. + +If you would rather explore a complete configuration, you can view a sample application instead. + +### Configure Callback URLs + +A callback URL is a URL in your application that you would like Auth0 to redirect users to after they have authenticated. If not set, users will not be returned to your application after they log in. + + +If you are following along with our sample project, set this to `http://localhost:4200`. + + +### Configure Logout URLs + +A logout URL is a URL in your application that you would like Auth0 to redirect users to after they have logged out. If not set, users will not be able to log out from your application and will receive an error. + + +If you are following along with our sample project, set this to `http://localhost:4200`. + + +### Configure Allowed Web Origins + +An Allowed Web Origin is a URL that you want to be allowed to access to your authentication flow. This must contain the URL of your project. If not properly set, your project will be unable to silently refresh authentication tokens, so your users will be logged out the next time they visit your application or refresh a page. + + +If you are following along with our sample project, set this to `http://localhost:4200`. + + + + + +Auth0 provides an [Angular SDK](https://github.com/auth0/auth0-angular) to simplify the process of implementing Auth0 authentication and authorization in Angular applications. + +Install the Auth0 Angular SDK by running the following command in your terminal: + +`npm install @auth0/auth0-angular` + +The SDK exposes several types that help integrate Auth0 in an Angular application idiomatically, including a module and an authentication service. + + + + +The SDK exports `provideAuth0`, which is a provide function that contains all the services required for the SDK to function. To register this with your application: + +1. Open the `main.ts `file. +2. Import the `provideAuth0 `function from the `@auth0/auth0-angular `package. +3. Add `provideAuth0 `to the application by adding it to the `providers `inside `bootstrapApplication`. +4. Inject `AuthService `into `AppComponent`. + +The `provideAuth0` function takes the properties `domain` and `clientId`; the values of these properties correspond to the **Domain** and **Client ID** values that you can find under **Settings** in the Single-Page Application (SPA) that you registered with Auth0. On top of that, we configure `authorizationParams.redirect_uri`, which allows Auth0 to redirect the user back to the specific URL after successfully authenticating. + + +If you are using a [custom domain with Auth0](https://auth0.com/docs/custom-domains), the value of the domain property is the value of your custom domain instead of the value reflected in the "Settings" tab. + + + + + +Now that you have configured your Auth0 Application and the Auth0 Angular SDK, you need to set up login for your project. To do this, you will use the SDK’s `loginWithRedirect()` method from the `AuthService` class to redirect users to the Auth0 Universal Login page where Auth0 can authenticate them. After a user successfully authenticates, they will be redirected to your application and the callback URL you set up earlier in this quickstart. + +Create a login button in your application that calls `loginWithRedirect()` when selected. + + +##### Checkpoint + +You should now be able to log in to your application. + +Run your application, and select the login button. Verify that: + +- you can log in or sign up using a username and password. +- your application redirects you to the [Auth0 Universal Login](https://auth0.com/universal-login) page. +- you are redirected to Auth0 for authentication. +- Auth0 successfully redirects back to your application after authentication. +- you do not receive any errors in the console related to Auth0. + + + + + + + +Users who log in to your project will also need [a way to log out](https://auth0.com/docs/logout/guides/logout-auth0). The SDK provides a `logout()` method on the `AuthService` class that you can use to log a user out of your app. When users log out, they will be redirected to your [Auth0 logout endpoint](https://auth0.com/docs/api/authentication?javascript#logout), which will then immediately redirect them to your application and the logout URL you set up earlier in this quickstart. + +Create a logout button in your application that calls `logout()` when selected. + + +The SDK exposes an `isAuthenticated$` observable on the `AuthService` class that allows you to check whether a user is authenticated or not. You can render the login and logout buttons conditionally based on the value of the `isAuthenticated$` observable. Alternatively, you can use a single button to combine both login and logout buttons as well as their conditional rendering. + + + +##### Checkpoint + +You should now be able to log out of your application. + +Run your application, log in, and select the logout button. Verify that: + +- you are redirected to Auth0's logout endpoint. +- Auth0 successfully redirects back to your application and the correct logout URL. +- you are no longer logged in to your application. +- you do not receive any errors in the console related to Auth0. + + + + + + +Now that your users can log in and log out, you will likely want to be able to retrieve the [profile information](https://auth0.com/docs/users/concepts/overview-user-profile) associated with authenticated users. For example, you may want to be able to personalize the user interface by displaying a logged-in user’s name or profile picture. + +The Auth0 Angular SDK provides user information through the `user$` observable exposed by the `AuthService` class. Because the `user$` observable contains sensitive information and artifacts related to the user's identity, its availability depends on the user's authentication status. Fortunately, the `user$` observable is configured to only emit values once the `isAuthenticated$` observable is true, so there is no need to manually check the authentication state before accessing the user profile data. + +The SDK also exposes an `isAuthenticated$` observable on the `AuthService` class that allows you to check whether a user is authenticated or not, which you can use to determine whether to show or hide UI elements, for example. + +Review the `UserProfileComponent` code in the interactive panel to see examples of how to use these functions. + + +##### Checkpoint + +You should now be able to view user profile information. + +Run your application, and verify that: + +- user information displays correctly after you have logged in. +- user information does not display after you have logged out. + + + + +## Next Steps" + +Excellent work! If you made it this far, you should now have login, logout, and user profile information running in your application. + +This concludes our quickstart tutorial, but there is so much more to explore. To learn more about what you can do with Auth0, check out: + + + + Learn how to configure and manage your Auth0 tenant and applications + + + Explore the SDK used in this tutorial more fully + + + Discover integrations you can enable to extend Auth0’s functionality + + + + +```ts main.ts +import { bootstrapApplication } from '@angular/platform-browser'; +import { provideAuth0 } from '@auth0/auth0-angular'; +import { AppComponent } from './app.component'; + +bootstrapApplication(AppComponent, { + providers: [ + provideAuth0({ + domain: '{yourDomain}', + clientId: '{yourClientId}', + authorizationParams: { + redirect_uri: window.location.origin + } + }), + ] +}); +``` +```ts login-button.ts +import { Component } from '@angular/core'; +import { AuthService } from '@auth0/auth0-angular'; + +@Component({ + selector: 'app-login-button', + template: '', + standalone: true +}) +export class LoginButtonComponent { + constructor(private auth: AuthService) {} + + login() { + this.auth.loginWithRedirect(); + } +} +``` +```ts logout-button.ts +import { Component, Inject } from '@angular/core'; +import { AuthService } from '@auth0/auth0-angular'; +import { DOCUMENT } from '@angular/common'; + +@Component({ + selector: 'app-logout-button', + template: ` + + `, + standalone: true +}) +export class LogoutButtonComponent { + constructor( + @Inject(DOCUMENT) public document: Document, + private auth: AuthService + ) {} + + logout() { + this.auth.logout({ + logoutParams: { + returnTo: this.document.location.origin + } + }); + } +} +``` +```ts user-profile.ts +import { Component } from '@angular/core'; +import { AuthService } from '@auth0/auth0-angular'; + +@Component({ + selector: 'app-user-profile', + template: ` + `, + standalone: true +}) +export class UserProfileComponent { + constructor(public auth: AuthService) {} +} +``` + diff --git a/main/docs/quickstarts.mdx b/main/docs/quickstarts.mdx new file mode 100644 index 0000000..a9c9211 --- /dev/null +++ b/main/docs/quickstarts.mdx @@ -0,0 +1,66 @@ +--- +title: Quickstarts +description: "Step-by-step guides to quickly integrate Auth0 into your application" +--- + +## Regular Web App + +Traditional web app that runs on the server + + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + +## Single Page App + +Single page app that runs in the browser + + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + +## Native/Mobile App + +Mobile or Desktop app that runs natively on a device + + + } horizontal /> + diff --git a/main/docs/troubleshoot/debugging-best-practices.mdx b/main/docs/troubleshoot/debugging-best-practices.mdx new file mode 100644 index 0000000..1820db1 --- /dev/null +++ b/main/docs/troubleshoot/debugging-best-practices.mdx @@ -0,0 +1,70 @@ +--- +title: Debugging Best Practices +--- + +## Rule debugging + + +The `consoleOut` property is a log output generated by customers within the Auth0 platform through Actions, Rules, Hooks, Extensions, and DB Scripts.  + +Auth0 recommends using the `consoleOut` property for testing and debugging purposes only. You should not log personal data or other sensitive data into the web console or the log output will include such data. + +Out of the box, typically, you [debug a rule during runtime](https://auth0.com/docs/customize/rules/debug-rules) via console logging by using the `console.log` facility. To learn more, read [console.log() in MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/Console/log). There is no interactive debugging of a rule available within the Auth0 platform (though one could employ the testing automation technique described below in conjunction with some external interactive source-debugging facility; to learn more, read [Rules Testing Best Practices](https://auth0.com/docs/rules-best-practices/rules-testing-best-practices)). + +## Add line comments + +Adding sufficient line (i.e., `//`) or block (i.e., `/* */`) comments to a rule, particularly around non-obvious functionality, is invaluable to both code debugging and also code understanding, particularly as there are many occasions where the initial implementer of a rule may not be the same person responsible for maintaining it going forward. + +## Real-time Webtask logging + +By default, console log output is unavailable for display during normal execution. However, you can [use the Real-time Webtask Logs extension](https://auth0.com/docs/customize/extensions/real-time-webtask-logs) to display all console logs in real-time for all implemented extensibility in an Auth0 tenant, including rules. The real-time console log display provided by the extension includes all `console.log` output, `console.error` output, and `console.exception` output. To learn more, read [console.error() in MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/Console/error). + +## Enable and disable debug logging + +In a production environment, debug logging isn’t something that’s desirable all the time; given the performance considerations associated with rules, it would not be prudent to have it continuously enabled. To learn more, read [Performance Best Practices](https://auth0.com/docs/troubleshoot/performance-best-practices). + +However, in a development or testing environment, the option to enable it on a more continuous basis is much more desirable. Further, excessive debug logging could create substantial “noise”, which could make identifying problems that much harder. + +Modifying a rule to enable or disable debug logging dependent on the environment would be messy and prone to error. To learn more, read [Rules Environment Best Practices](https://auth0.com/docs/rules-best-practices/rules-environment-best-practices). Instead, the environment configuration object can be leveraged to implement conditional processing in a fashion similar to the following: + +```js +function NPClaims(user, context, callback) { + /* + * This rule (https://auth0.com/docs/rules) is used to derive + * effective claims associated with the Normalized User Profile: + * https://auth0.com/docs/user-profile/normalized/auth0 + */ + var LOG_TAG = '[NORMALIZED_PROFILE_CLAIMS]: '; + var DEBUG = configuration.DEBUG ? console.log : function () {}; + DEBUG(LOG_TAG, "identities=", user.identities); + user.user_metadata = user.user_metadata || {}; + + // + user.family_name = + user.family_name || + user.identities.filter(function(identity) { + /* Filter out identities which do not have anything synonymous with + * Family Name + */ + return( + identity.profileData && + identity.profileData.family_name); + }).map(function(identity) { + return identity.profileData.family_name; + })[0]; + DEBUG(LOG_TAG, "Computed user.family_name as '", user.family_name, "'"); + . + . + + // + return callback(null, user, context); + } +``` + +In the example above, a `DEBUG` environment configuration variable has been created, which can be set to `true` or `false` depending on the execution environment (e.g., production, testing, development). The setting of this variable is used to determine when debug logging is performed. Further, a `DEBUGLEVEL` environment `configuration` variable, say, could be created, which could be used to control the debugging log level (e.g., verbose, medium, sparse). + +The above example also demonstrates declaration of a named function. For convenience, providing a function name—using some compact and unique naming convention—can assist with diagnostic analysis. Anonymous functions make it hard in debugging situations to interpret the call-stack generated as a result of any exceptional error condition and providing a unique function name addresses this. To learn more, read [Error Handling Best Practices](https://auth0.com/docs/troubleshoot/error-handling-best-practices). + +### Static analysis + +The rule editor in the Auth0 Dashboard provides some rudimentary syntax checking and analysis of rule semantics. However, no provision is made for more complex static code analysis, such as overwrite detection, loop detection, or vulnerability detection. To address this, consider leveraging the use of third-party tooling—such as [JSHint](https://jshint.com/about/), [SonarJS](https://www.sonarsource.com/products/codeanalyzers/sonarjs.html), or [Coverity](https://www.synopsys.com/software-integrity/security-testing/static-analysis-sast.html)—in conjunction with rule testing as part of your deployment automation process. To learn more, read [Deployment Best Practices](https://auth0.com/docs/deploy-monitor/deployment-best-practices). diff --git a/main/docs/troubleshoot/error-handling-best-practices.mdx b/main/docs/troubleshoot/error-handling-best-practices.mdx new file mode 100644 index 0000000..a237078 --- /dev/null +++ b/main/docs/troubleshoot/error-handling-best-practices.mdx @@ -0,0 +1,57 @@ +--- +title: Error Handling Best Practices +description: "Error conditions returned from API calls must be handled and processed in an appropriate manner. Failure to do so can lead to unhandled exception situations, resulting in premature termination of pipeline execution and ultimately in an authentication error being returned." +--- + +## Send error logs to an external service + +We recommend sending error event logs to an external service to provide better visibility and diagnosis of anomalous operation. To retain and analyze your log events past the log retention period offered for your subscription plan, [use Auth0 log streaming](https://auth0.com/docs/customize/log-streams). You can use services like DataDog and AWS EventBridge. We also offer the ability to send logs to an external service in our [Log Streaming](https://marketplace.auth0.com/features/log-streaming) section in Auth0 Marketplace. + +## Use error objects in rules + +There are time constraints regarding how much time a rule has to execute. To learn more, read [Custom Database Action Script Execution Best Practices](https://auth0.com/docs/authenticate/database-connections/custom-db/custom-database-connections-scripts/execution). If recovery from an error condition is not possible (or probable) within this time period, then an error condition should be explicitly returned; this is as simple as completing rule execution by returning an instance of a Node `Error` object, as in: + +`return callback(new Error('some description'));` + +To learn more, read [Class: Error on nodejs.org](https://nodejs.org/api/errors.html#errors_class_error). + +Alternatively, an instance of the Auth0-specific `UnauthorizedError` can be returned, which causes an `unauthorized` error condition with the supplied error description to be returned to the application that initiated authentication—that is, the application from which redirect to the `/authorize` endpoint was initiated. This allows an application to offer conditional retry capability and allows you to implement rules to deny access based on certain conditions: + +`return callback(new UnauthorizedError('some description'), user, context);` + +## Use meaningful error code descriptions + +The `UnauthorizedError` object only returns the description supplied. To use specific processing for unauthorized error conditions, we recommend that you format your descriptions to include some easily accessible error code information, for example: + +`'[00043] - my specific error description'`) + +## Exception handling + +Unexpected error conditions, such as uncaught JavaScript exceptions, can result in the premature termination of pipeline execution, which will ultimately result in an error in authentication being returned. + +For situations involving asynchronous operations, you must use a `catch` handler when using `Promise` object processing. `Promise` object processing can also be effective for error handling during non-asynchronous operations. As illustrated below, a `Promise` object can be used to wrap, say, a synchronous function call, making it easier to implement cascaded error handling via use of promise chaining and the like. To learn more about the Promise object, read [Promise in MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). To learn more about promise chaining, read [Error Handling with Promises on javascript.info](https://javascript.info/promise-error-handling). + +```js +return new Promise(function(resolve, reject) { + jwt.verify( + token, + secret,{ + clockTolerance: 5}, + function(err, decoded) { + if (err) { + reject(err); + } else { + resolve(decoded); + } + }); + }); +``` +Alternatively, you can use `try...catch` processing to handle JavaScript exceptions that occur during synchronous operation. To learn more, read [`try...catch` in MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch).Setting up this type of exception handling can often incur performance costs, so use it sparingly; rule performance should be as optimal as possible. A more pragmatic approach is to implement processing that prevents exceptions from occurring rather than handling them once they have occurred. To learn more about best practices, see [Performance Best Practices](https://auth0.com/docs/troubleshoot/performance-best-practices). + +## Avoid uninitialized objects in rules + +If you use uninitialized objects, that can cause exceptions. We recommend that you include initialization as part of any declaration where the existence of an object is in question. For example: + +`user.user_metadata = user.user_metadata || {}`) + +In a rule, taking steps to prevent an exception from occurring in the first place is a best practice and is typically less costly in terms of performance and resource usage than implementing exception handling. diff --git a/main/favicon.svg b/main/favicon.svg new file mode 100644 index 0000000..ce85873 --- /dev/null +++ b/main/favicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/main/images/basic_login_app_background.svg b/main/images/basic_login_app_background.svg new file mode 100644 index 0000000..7ffc625 --- /dev/null +++ b/main/images/basic_login_app_background.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/main/images/custom_policy_background.png b/main/images/custom_policy_background.png new file mode 100644 index 0000000000000000000000000000000000000000..32476bb7334b430ce0194041dc27e2b3799eb945 GIT binary patch literal 59379 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 literal 0 HcmV?d00001 diff --git a/main/images/twilio_background.svg b/main/images/twilio_background.svg new file mode 100644 index 0000000..4a6a327 --- /dev/null +++ b/main/images/twilio_background.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/index.mdx b/main/index.mdx new file mode 100644 index 0000000..fe2a554 --- /dev/null +++ b/main/index.mdx @@ -0,0 +1,127 @@ +--- +mode: "custom" +--- + +export function openSearch() { + document.getElementById('search-bar-entry').click(); +} + +
+
+ +
+

+ Welcome to Auth0 docs! +

+

How can we help you?

+
+ +
+
+
+ +
+
Start Building
+

Choose your application type to get started

+ + + } href="/docs/quickstart/native" > + Mobile or Desktop app that runs natively on a device + e.g., iOS, Android + + + } href="/docs/quickstart/spa" > + JavaScript web app that runs in the browser + e.g., AngularJS + Node.js, React + + + } href="/docs/quickstart/webapp" > + Traditional web app that runs on the server + e.g., Express.js, ASP.NET + + + } href="/docs/quickstart/backend" > + An API or service protected by Auth0 + e.g., Express.js API, ASP.NET API + + + +
Learn about Auth0
+ + + + +

+ Rely on the Auth0 identity platform to add sophisticated authentication and authorization to your applications. Centralize and manage users from multiple identity providers and give them branded, seamless signup and login experiences. Finely control access with a degree of customization that can accommodate even the most complex security requirements. +

+ + + + Learn the basics and begin building your authentication solution. + + + Define how your applications and APIs verify the identity of a user or device. + + + Store and manage custom details about your users. + + + + + + Customize Auth0 using your own branding and extend our functionality to solve your unique identity needs. + + + Add multi-factor authentication and defend your application from bots, suspicious IPs, and password breaches. + + + Deploy Auth0 for your applications and monitor system health and events. + + + Troubleshoot challenges, learn about Auth0's different levels of support, and get help. + + +
diff --git a/main/ja/docs/articles.mdx b/main/ja/docs/articles.mdx new file mode 100644 index 0000000..7c8fb59 --- /dev/null +++ b/main/ja/docs/articles.mdx @@ -0,0 +1,36 @@ +--- +title: Auth0 ドキュメント +description: Auth0 + アイデンティティプラットフォームを利用して、アプリケーションに高度な認証と認可を追加します。複数のアイデンティティプロバイダーからユーザーを一元化して管理し、ブランド化された、シームレスなサインアップとログイン体験を提供します。最も複雑なセキュリティ要件にも対応できる程度のカスタマイズ性を持って、アクセスを細かく制御します。実装を簡単にデプロイし、ステータスとサービスを監視します。 +sidebarTitle: ホーム +--- + + + + 基本を学び、認証ソリューションの構築を始めましょう。 + + + + アプリケーションとAPIがユーザーまたはデバイスの身元を確認する方法を定義します。 + + + + ユーザーに関するカスタム詳細を保存および管理します。 + + + + 独自のブランディングを使用してAuth0をカスタマイズし、機能を拡張して固有のアイデンティティニーズを解決します。 + + + + 多要素認証を追加し、ボット、不審なIP、パスワード侵害からアプリケーションを守ります。 + + + + アプリケーション用にAuth0をデプロイし、システムの健全性とイベントを監視します。 + + + + 課題のトラブルシューティング、Auth0の様々なサポートレベルについて学び、ヘルプを得ます。 + + diff --git a/main/ja/docs/get-started/identity-fundamentals.mdx b/main/ja/docs/get-started/identity-fundamentals.mdx new file mode 100644 index 0000000..2b2ebe5 --- /dev/null +++ b/main/ja/docs/get-started/identity-fundamentals.mdx @@ -0,0 +1,21 @@ +--- +title: アイデンティティの基礎 +description: アイデンティティとアクセス管理の基礎に関連するトピックを探索します。 +sidebarTitle: 概要 +--- + +アイデンティティとアクセス管理の基礎に関連するトピックを探索します。 + + + + IAMの基本概念。 + + + + 認証と認可の違いについて。 + + + + アイデンティティに関連する様々な用語の定義。 + + diff --git a/main/ja/docs/get-started/identity-fundamentals/authentication-and-authorization.mdx b/main/ja/docs/get-started/identity-fundamentals/authentication-and-authorization.mdx new file mode 100644 index 0000000..7b33b75 --- /dev/null +++ b/main/ja/docs/get-started/identity-fundamentals/authentication-and-authorization.mdx @@ -0,0 +1,27 @@ +--- +title: 認証と認可 +description: しばしば互換的に使用されますが、[認証](https://auth0.com/docs/authenticate)と認可は根本的に異なる機能を表します。この記事では、両者を比較対照し、どのように相補的な方法でアプリケーションを保護するかを示します。 +--- + +## 認証と認可とは何か? + +簡単に言えば、認証はユーザーが誰であるかを確認するプロセスであり、認可はユーザーが何にアクセスできるかを確認するプロセスです。 + +これらのプロセスを現実世界の例に例えると、空港のセキュリティチェックを通過する際、身分証明書を提示して身元を認証します。その後、搭乗口に到着すると、フライトアテンダントに搭乗券を提示し、飛行機への搭乗を認可され、アクセスが許可されます。 + +## 認証と認可の比較 + +以下は、認証と認可の違いの簡単な概要です: + +| **認証** | **認可** | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| ユーザーが主張する通りの人物であるかどうかを判断する | ユーザーが何にアクセスできるかどうかを判断する | +| ユーザーに資格情報の検証を要求する(例:パスワード、セキュリティ質問への回答、顔認証など) | ポリシーやルールを通じてアクセスが許可されているかどうかを確認する | +| 通常、認可の前に行われる | 通常、認証が成功した後に行われる | +| 一般的に、IDトークンを通じて情報を伝達する | 一般的に、アクセストークン | +| 一般的にOpenID Connect (OIDC) プロトコル | 一般的にOAuth 2.0フレームワークによって管理される | +| Example: Employees in a company are required to authenticate through the network before accessing their company email | Example: After an employee successfully authenticates, the system determines what information the employees are allowed to access | + +要するに、リソースへのアクセスは認証と認可の両方によって保護されています。自分の身元を証明できない場合、リソースへのアクセスは許可されません。そして、身元を証明できたとしても、そのリソースに対する認可がない場合、アクセスは依然として拒否されます。 + +Auth0は認証のための製品とサービスを提供しています。例えば、[passwordless](https://auth0.com/docs/authenticate/passwordless/passwordless-with-universal-login)、[多要素認証](https://auth0.com/docs/secure/multi-factor-authentication)(MFA)、そして[シングルサインオン(SSO)](https://auth0.com/docs/authenticate/single-sign-on)などがあり、これらはAuth0 DashboardまたはManagement APIを使用して設定できます。認可については、Auth0は[ロールベースのアクセス制御](https://auth0.com/docs/manage-users/access-control/rbac)(RBAC)または[細粒度の認可](https://docs.fga.dev/fga) FGA)を提供しています。 diff --git a/main/ja/docs/get-started/identity-fundamentals/identity-and-access-management.mdx b/main/ja/docs/get-started/identity-fundamentals/identity-and-access-management.mdx new file mode 100644 index 0000000..30fd971 --- /dev/null +++ b/main/ja/docs/get-started/identity-fundamentals/identity-and-access-management.mdx @@ -0,0 +1,142 @@ +--- +title: アイデンティティ&アクセス管理(IAM)の紹介 +--- + +## アイデンティティとアクセス管理(IAM)とは何ですか? + +アイデンティティとアクセス管理は、ユーザー認証とリソースアクセスの制御を提供します。一般的にIAMとして知られるこの技術は、適切な人が適切なタイミングで適切な理由により適切なデジタルリソースにアクセスできることを保証します。 + +## IAMの基本概念 + +IAMを理解するには、いくつかの基本的な概念を知っておく必要があります: + +* デジタルリソース**デジタルリソース**は、コンピューターシステム内のアプリケーションとデータの任意の組み合わせです。デジタルリソースの例には、Webアプリケーション、API、プラットフォーム、デバイス、またはデータベースが含まれます。 +* IAMの核心は**アイデンティティ**です。誰かがあなたのリソースへのアクセスを求めています。それは顧客、従業員、メンバー、参加者などかもしれません。IAMでは、**ユーザー**アカウントがデジタルアイデンティティです。ユーザーアカウントは、ソフトウェア、IoTデバイス、ロボットなどの非人間を表すこともできます。 + + + + + +
+ + + + + +* **認証**は、デジタルアイデンティティの検証です。誰か(または何か)が、自分が主張するユーザーであることを証明するために認証を行います。 +* **認可**は、ユーザーがアクセスできるリソースを決定するプロセスです。 + +## 認証と認可の違い + +認証と認可は、ユーザーにとって単一の体験のように見えるため、混同されがちです。しかし、これらは2つの別個のプロセスです:認証はユーザーのアイデンティティを証明し、認可はユーザーの特定のリソースへのアクセスを許可または拒否します。 + +認証と認可をオフィスビルのセキュリティシステムとして考えることができます。ユーザーはビルに入りたい人々です。人々がアクセスしたいリソースは、ビル内の領域です:フロア、部屋など。 + +**Authentication:**ビルに入る際、警備員に写真付きIDバッジを見せる必要があります。警備員はバッジの写真とあなたの顔を比較します。一致すれば、警備員はあなたをドアの中に通し、ビルのさまざまな領域へのアクセスを試みることができます。警備員はあなたがどの部屋にアクセスできるかを教えません。彼らはただ、あなたが主張する人物であることの証明を得るだけです。これが認証です:ユーザーのアイデンティティを確認すること。 + + + + + +**Authorization:**このシナリオでは、ビル内のエレベーターやドアウェイにアクセス用のキーセンサーがあると想像してください。あなたのバッジのチップは、あなたの会社が占有する1階へのアクセスのみを許可します。他の階にアクセスしようとしてバッジをスワイプすると、アクセスは拒否されます。あなたは自分のプライベートオフィスにはアクセスできますが、同僚のオフィスにはアクセスできません。備品室には入れますが、サーバールームには入れません。これが認可です:アイデンティティに基づいて異なるリソースへのアクセスを許可および拒否すること。 + + + + + +認証と認可についてさらに詳しく知るには、[認証と認可の違い](https://auth0.com/docs/get-started/identity-fundamentals/authentication-and-authorization)をお読みください。 + +## IAMは何をするのか? + +アイデンティティとアクセス管理は、ユーザー認証とリソースアクセスの制御を提供します: + +* ユーザーがどのようにしてあなたのシステムの一部になるか +* どのユーザー情報を保存するか +* ユーザーがどのように自身のアイデンティティを証明できるか +* ユーザーがいつ、どのくらいの頻度でアイデンティティを証明する必要があるか +* アイデンティティを証明する体験 +* 誰が異なるリソースにアクセスできるか、できないか + +IAMをアプリケーション、API、デバイス、データストア、またはその他のテクノロジーと統合します。この統合は非常にシンプルな場合があります。例えば、Webアプリケーションが認証を完全にFacebookに依存し、オールオアナッシングの認可ポリシーを持っているような場合です。アプリは簡単なチェックを行います:現在のブラウザでユーザーがFacebookにログインしていない場合、ログインするよう指示します。認証されると、すべてのユーザーがアプリのすべての機能にアクセスできます。 + +このような単純なIAMソリューションがユーザー、組織、業界、またはコンプライアンス基準のニーズを満たすことはほとんどありません。現実の世界では、IAMは複雑です。ほとんどのシステムは、以下の機能の組み合わせを必要とします: + +* **シームレスなサインアップとログイン体験:**スムーズでプロフェッショナルなログインとサインアップ体験が、あなたのブランドのルックアンドフィールと言語で、アプリ内で行われます。 +* **複数のユーザーアイデンティティソース:**ユーザーは、様々なソーシャル(GoogleやLinkedinなど)、エンタープライズ(Microsoft Active Directoryなど)、その他の[アイデンティティプロバイダー](https://auth0.com/docs/authenticate/identity-providers)を使用してログインできることを期待しています。 +* **多要素認証(MFA):**パスワードが頻繁に盗まれる時代において、追加の身元証明を要求することが新しい標準となっています。指紋認証やワンタイムパスワードは、一般的な認証方法の例です。詳細については、[多要素認証(MFA)](https://auth0.com/docs/secure/multi-factor-authentication)をお読みください。 +* **ステップアップ認証:**高度な機能や機密情報へのアクセスには、日常的なタスクやデータよりも強力な身元証明が必要です。ステップアップ認証は、選択された領域や機能に対して追加の身元確認を要求します。詳細については、[ステップアップ認証の追加](https://auth0.com/docs/secure/multi-factor-authentication/step-up-authentication)をお読みください。 +* **攻撃保護:**ボットや悪意のある行為者がシステムに侵入するのを防ぐことは、サイバーセキュリティの基本です。詳細については、[攻撃保護](https://auth0.com/docs/secure/attack-protection)をお読みください。 +* **ロールベースアクセス制御(RBAC):**ユーザー数が増えるにつれ、各個人のアクセスを管理することはすぐに非現実的になります。RBACでは、同じロールを持つ人々は同じリソースへのアクセス権を持ちます。詳細については、[ロールベースアクセス制御](https://auth0.com/docs/manage-users/access-control/rbac)をお読みください。 +* **きめ細かな認可(FGA):**リソースやテクノロジーへのユーザーアクセスを管理するためのより多くのオプションが必要な場合、関係ベースのアクセス制御を使用してロールベースを超えることができます。個々のユーザーに特定のリソースへのアクセスを与え、特定のユースケースに最適なソリューションを決定できます。詳細については、[きめ細かな認可とは何か?](https://docs.fga.dev/intro/authorization-and-okta-fga#what-is-fine-grained-authorization) + +このレベルの複雑さに直面して、多くの開発者は自前のソリューションを構築する代わりに、Auth0のようなIAMプラットフォームに頼っています。 + +## IAMはどのように機能するか? + +「アイデンティティとアクセス管理」は明確に定義された単一のシステムではありません。IAMはデジタルリソースへの安全なアクセスという課題を解決するための規律とフレームワークの一種です。IAMシステムを実装するためのアプローチには無限の可能性があります。このセクションでは、一般的な実装における要素と実践について探ります。 + +### アイデンティティプロバイダー + +過去には、アイデンティティとアクセス管理の標準は、システムがユーザーのためにアイデンティティ情報を作成し管理することでした。ユーザーが新しいWebアプリケーションを使用したい場合、毎回アカウントを作成するためのフォームに記入しました。アプリケーションはログイン認証情報を含むすべての情報を保存し、ユーザーがサインインするたびに独自の認証を実行しました。 + +インターネットが成長し、より多くのアプリケーションが利用可能になるにつれ、ほとんどの人々は無数のユーザーアカウントを蓄積し、それぞれに覚えるべきアカウント名とパスワードがありました。このように機能し続けているアプリケーションは多くありますが、多くの他のアプリケーションは現在、開発とメンテナンスの負担とユーザーの労力を減らすために、アイデンティティプロバイダーに依存しています。 + +アイデンティティプロバイダーは、アイデンティティ情報を作成、維持、管理し、他のアプリケーションに認証サービスを提供することができます。例えば、Googleアカウントはアイデンティティプロバイダーです。ユーザー名、フルネーム、職位、メールアドレスなどのアカウント情報を保存します。Slateオンラインマガジンでは、情報を新たに入力して保存する手順を踏むのではなく、Google(または他のアイデンティティプロバイダー)でログインすることができます。 + + + + + +アイデンティティプロバイダーは、それに依存するアプリケーションと認証情報を共有しません。例えば、SlateはあなたのGoogleパスワードを見ることはありません。Googleは、あなたが身元を証明したことをSlateに知らせるだけです。 + +その他のアイデンティティプロバイダーには、ソーシャルメディア(FacebookやLinkedInなど)、エンタープライズ(Microsoft Active Directoryなど)、法的アイデンティティプロバイダー(スウェーデンのBankIDなど)があります。 + +### 認証要素 + +認証要素はユーザーの身元を証明する方法です。一般的に、以下の基本的なタイプに分類されます: + +| 要素タイプ | 例 | +| --------------- | -------------- | +| 知識(あなたが知っているもの) | PIN、パスワード | +| 所有(あなたが持っているもの) | 携帯電話、暗号化キーデバイス | +| 固有性(あなたの特徴) | 指紋、顔認証、虹彩スキャン | + +IAMシステムは、身元を確認するために1つまたは複数の認証要素を必要とします。 + +### 認証と認可の標準 + +認証と認可の標準は、以下の方法に関するガイダンスを提供するオープンな仕様とプロトコルです: + +* アイデンティティを管理するIAMシステムの設計 +* 個人データの安全な移動 +* リソースにアクセスできる人の決定 + +これらのIAM業界標準は、最も安全で信頼性が高く、実装が実用的であると考えられています: + +#### OAuth 2.0 + +OAuth 2.0は、APIにアクセスするための委任プロトコルであり、IAMの業界標準プロトコルです。オープンな認可プロトコルであるOAuth 2.0は、アプリがユーザーの認証情報を共有することなく、ユーザーに代わって他のWebアプリがホストするリソースにアクセスすることを可能にします。これは、サードパーティの開発者がFacebook、Google、Twitterなどの大規模なソーシャルプラットフォームをログインに利用できるようにする標準です。詳細については、[OAuth 2.0認可フレームワーク](https://auth0.com/docs/authenticate/protocols/oauth)をお読みください。 + +#### OpenID Connect + +OAuth 2.0の上に構築されたシンプルなアイデンティティレイヤーであるOpenID Connect(OIDC)は、ユーザーの身元を簡単に確認し、アイデンティティプロバイダーから基本的なプロファイル情報を取得することを可能にします。OIDCは別のオープン標準プロトコルです。詳細については、[OpenID Connectプロトコル](https://auth0.com/docs/authenticate/protocols/openid-connect-protocol)をお読みください。 + +#### JSONウェブトークン + +JSONウェブトークン(JWT)は、当事者間で情報をJSONオブジェクトとして安全に送信するためのコンパクトで自己完結型の方法を定義するオープン標準です。JWTはデジタル署名されているため、検証および信頼することができます。これらは、認証されたユーザーの身元をアイデンティティプロバイダーと認証を要求するサービス間で渡すために使用できます。また、認証および暗号化することもできます。詳細については、[JSONウェブトークン](https://auth0.com/docs/secure/tokens/json-web-tokens)をお読みください。 + +#### Security Assertion Markup Language(SAML) + +Security Assertion Markup Language(SAML)は、企業がユーザー認証および認可情報をパートナー企業や従業員が使用するエンタープライズアプリケーションに伝達できるようにするオープン標準のXMLベースのデータ形式です。詳細については、[SAML](https://auth0.com/docs/authenticate/protocols/saml)をお読みください。 + +#### Web Services Federation(WS-Fed) + +Microsoftによって開発され、その多くのアプリケーションで広く使用されているこの標準は、アイデンティティと認可情報を交換するために異なるエンティティ間でセキュリティトークンを転送する方法を定義しています。詳細については、[Web Services Federationプロトコル](https://auth0.com/docs/authenticate/protocols/ws-fed-protocol)をお読みください。 + +## なぜIAMプラットフォームを使用するのか? + +なぜ多くの開発者が、ゼロから独自のソリューションを構築するのではなく、アイデンティティとアクセス管理プラットフォーム上に構築することを選択するのでしょうか? + +ユーザーの期待、顧客の要件、およびコンプライアンス基準は、重大な技術的課題をもたらします。複数のユーソース、認証要素、およびオープンな業界標準があるため、典型的なIAMシステムを構築するために必要な知識と作業量は膨大になる可能性があります。強力なIAMプラットフォームは、すべてのアイデンティティプロバイダーと認証要素に対する組み込みのサポートを持ち、ソフトウェアとの簡単な統合のためのAPIを提供し、認証と認可のための最も安全な業界標準に依存しています。 + +IAMソリューションを構築するか購入するかをまだ決定していない人々にとって、[構築 vs. 購入:アイデンティティ管理の評価ガイド](https://auth0.com/resources/whitepapers/build-vs-buy-evaluating-identity-management)は有用なリソースです。 diff --git a/main/ja/docs/get-started/identity-fundamentals/introduction-to-auth0.mdx b/main/ja/docs/get-started/identity-fundamentals/introduction-to-auth0.mdx new file mode 100644 index 0000000..20d017c --- /dev/null +++ b/main/ja/docs/get-started/identity-fundamentals/introduction-to-auth0.mdx @@ -0,0 +1,97 @@ +--- +title: Auth0 の紹介 +description: Auth0 + はアイデンティティアクセス管理(IAM)プロバイダーです。しかし、これは何を意味するのでしょうか?[アイデンティティとアクセス管理(IAM)の紹介](https://auth0.com/docs/get-started/identity-fundamentals/identity-and-access-management)を読んだことがあれば、IAMソリューションは、Webアプリケーション、API + などとしてお客様に提供するリソースへのゲートキーパーであることがわかります。 +--- + +ゲートキーパーは以下に概説されている認可を開始します OAuth 2.0。さらに OpenID Connect レイヤーを追加することで、ユーザーの デジタル アイデンティティと製品を保護するための認証が追加されます。 + +Auth0アイデンティティプラットフォームは、さまざまなアプリケーションタイプとフレームワークをサポートしています。あなたのアプリケーションが通常のWebアプリ、モバイルアプリ、またはマシン間アプリであっても、Auth0は各タイプに最も安全な認可グラント(ワークフロー)の設定を提供します。認可グラントについてより詳しく知り、あなたのアプリケーションに適したものを選ぶには、以下の記事をお読みください [どのOAuth 2.0フローを使用すべきか?](https://auth0.com/docs/get-started/authentication-and-authorization-flow/which-oauth-2-0-flow-should-i-use) + +安全なプロトコルをサポートすることに加えて、Auth0アイデンティティプラットフォームでは、あなたのビジネス、技術、顧客基盤に合わせてログインサービスをカスタマイズすることができます。 Auth0 DashboardManagement APIを使用して、お客様を認証および認可するための独自のAuth0インスタンスを作成できます。ログイン動作の設定、ユーザーデータストアの接続、それらのユーザーの管理、認可グラントの選択、認証要素の確立を行い、シームレスでスケーラブルな製品と印象的なユーザーエクスペリエンスを実現できます。 + +## はじめに + +### アイデンティティの基礎 + +Auth0をアプリケーションやAPIに統合するためにIAMの専門家である必要はありませんが、いくつかの重要な概念を知っていれば、ユースケースに適した設定を選択できます。詳しく学ぶには、以下の記事をお読みください [アイデンティティとアクセス管理(IAM)の紹介](https://auth0.com/docs/get-started/identity-fundamentals/identity-and-access-management)。実装の計画についてまだ疑問がある場合は、以下のセクションで実際のシナリオのウォークスルーを確認してください [アーキテクチャシナリオ](https://auth0.com/docs/get-started/architecture-scenarios)。 + +### Auth0との統合 + +Auth0との統合を開始するには、初期設定とクイック構成のための対話型の [クイックスタートガイド](https://auth0.com/docs/quickstarts) から始めるか、Auth0 Dashboardでアプリケーションを手動で登録することができます。Dashboardでは、テナント(つまりあなたのAuth0インスタンス)を一から作成できます。SDKを使用したい場合、Auth0は各アプリケーションタイプに複数のオプションを提供しています。全ての提供物を見るには、以下に移動してください [Auth0ライブラリ](https://auth0.com/docs/libraries)。 + +Dashboardのテナント設定で一般的な詳細から設定を始めることができます。例えば、ユーザーに表示される名前、会社のロゴ、コールバックURL(認証後にAuth0がユーザーをリダイレクトする場所)などです。私たちの推奨事項は以下を読むことで確認できます [テナント設定](https://auth0.com/docs/get-started/tenant-settings)。 + +テナントを設定したら、アプリケーションまたはAPIを作成して設定できます。以下の記事の指示を出発点として使用できます [アプリケーションの作成](https://auth0.com/docs/get-started/auth0-overview/create-applications) または [APIの登録](https://auth0.com/docs/get-started/auth0-overview/set-up-apis)。 + +### 認証 + +認証の手段はログインフォームです。これはユーザーがあなたのアプリケーションにアクセスするための仲介役です。ユーザーはログインフォームで、ユーザー名やパスワードなどの事前に決められた認証情報を提供し、自身のデジタルアイデンティティを確認します。 + +Auth0の Universal Loginはカスタマイズ可能なログインフォームで、ブランドに合わせて調整し、安全なアクセスを提供するように設定できます。Universal Loginを使用する利点には以下があります: + +* Passwordless生体認証によるログイン +* 選択肢として多要素認証方法(メール、音声、またはDuo) +* Single Sign-on (SSO)機能 +* ローカライゼーションサポート + +詳細については、[Universal Login](https://auth0.com/docs/authenticate/login/auth0-universal-login)をお読みください。利用可能な機能の詳細については、[Universal Login vs. Classic Login](https://auth0.com/docs/authenticate/login/auth0-universal-login/universal-login-vs-classic-login)をご覧ください。 + +ログインフォームを用意したら、ユーザーストアをAuth0に接続できます。既存のデータベースを接続するか、ソーシャル、法的、または企業のアイデンティティプロバイダー(XやAzure Active Directoryなど)を使用できます。新しいユーザーは、設定した接続を使用してサインアップできます。 + +ログインフォームとユーザーストア接続を用意したら、ユーザーがアプリケーションにログインする際にバックグラウンドで動作するプロトコルを設定できます。最も一般的なプロトコルは、[Identity Fundamentals](https://auth0.com/docs/get-started/identity-fundamentals)の記事で確認したOAuth 2.0およびOpenID Connect(OIDC)の仕様に関連しています。 + +ログイン時に情報を安全に送信するもう1つのプロトコルは、トークンの形式で提供されます。Authorization Server(Auth0の認証API)からのトークンは、エンティティ間で情報を送信します。ユーザーがログインしてアクセスが承認されると、認証APIは使用している認証グラントに応じて、アクセストークン、IDトークン、または両方を送信してセッションを作成します。アクセストークンには、リクエスト元がアプリケーションで持つスコープ(権限)に関する情報が含まれており、IDトークンにはユーザーエクスペリエンスを向上させるためのユーザーメタデータなど、リクエスト元の情報が含まれています。 + +認証APIからのトークンは、以下の構造を持つJSON Web Tokens(JWTs)です: + +* 署名を含むヘッダー +* リクエスト元に関する声明と属性を含むペイロード +* トークンが有効であることを確認する署名 + +トークンについて詳しく学ぶには、[Access Tokens](https://auth0.com/docs/secure/tokens/access-tokens)、[ID Tokens](https://auth0.com/docs/secure/tokens/id-tokens)、または[JSON Web Tokens](https://auth0.com/docs/secure/tokens/json-web-tokens)をお読みください。 + +SAML(Security Assertion Markup Language)やWS-Fed(Web Service Federation)などの他のプロトコルは、より特定のシステムで使用されます。SAMLは一部のアイデンティティプロバイダーで動作し、WS-FedはMicrosoft製品で使用されます。詳細については、ドキュメントの[Protocols](https://auth0.com/docs/authenticate/protocols)セクションを探索することで学ぶことができます。 + +### ユーザーの管理 + +ユーザープロファイルとアクセスの管理は時間がかかる場合があります。Auth0インスタンスでユーザーを管理することを選択すれば、いくつかの問題点を解消できます。 + +Auth0ダッシュボードまたは管理APIを使用して、CRUD操作を簡単に自動化し、ユーザープロファイルをクエリできます。Auth0 Organizationsを使用してユーザーをカテゴリに分類し、管理スタイルに合わせて顧客ベースを整理できます。詳細については、ドキュメントの[Manage Users](https://auth0.com/docs/manage-users)セクションをご覧ください。 + +ビジネスモデルには、ユーザーのアクセスレベルが含まれている場合があります。ユーザーの一部に読み取り専用の権限を与え、別の一部に編集能力を与えたい場合があるかもしれません。Auth0の Authorization Coreを使用すると、ロールベースのアクセス制御を実装できます。ロールを作成し、ユーザーにロールを割り当て、権限を定義することができます。 + +ブラウザの動作に基づいてアクセスを管理したい場合、セッションの有効期間を制限できます。セッション、つまり要求元とアプリケーションまたはリソースとの間のインタラクションには、有効期間の制限があります。セッションは、ユーザーがブラウザを閉じたり、ウェブページから離れたりすると終了する可能性があります。アクセストークンを更新するリフレッシュトークンを使用してセッションを延長できます。リフレッシュトークンはダッシュボードで設定できます。詳細については、以下をお読みください:[セッションの有効期間制限](https://auth0.com/docs/manage-users/sessions/session-lifetime-limits)および[リフレッシュトークンの取得](https://auth0.com/docs/secure/tokens/refresh-tokens/get-refresh-tokens)。 + +クッキー(データの文字列)は、セッションと結びつき、認証されたユーザーを表します。クッキーにより、認証されたユーザーはセッションを維持し、再認証を強制されることなくウェブページ間を移動できます。ブラウザが閉じられると、クッキーはブラウザによってクリアされます。 + +### カスタマイズ + +あなたのブランドは重要であり、Auth0はログイン体験をあなたのビジネスにより個別化するためのカスタマイズを提供しています。ログインフォームにロゴやカラースキームを追加したり、カスタムドメインを使用してログインURLの所有権を得ることができます。設定の詳細については、以下をお読みください:[カスタムドメイン](https://auth0.com/docs/customize/custom-domains)。 + +Universal Loginは、多要素認証、デバイスの生体認証を使用したパスワードレス認証、ローカライゼーションなど、ニーズに合わせて認証を設定するための多数の機能を提供します。より詳細なレベルでは、アクションが必要な場合にユーザーが受け取るプロンプトのテキストを調整できます。ユーザーにサインアップを促したり、認証用のデバイスを登録したり、検証のためにユーザーがコードを入力するためのメール/SMSを送信したりするためのプロンプトを設定できます。また、新規ユーザーを歓迎したり、登録を確認したり、パスワードをリセットしたりするためのメールテンプレートを使用して、メールコミュニケーションをカスタマイズすることもできます。詳細については、以下をお読みください:[Universal Loginのテキスト要素のカスタマイズ](https://auth0.com/docs/customize/login-pages/universal-login/customize-text-elements)および[メールテンプレートのカスタマイズ](https://auth0.com/docs/customize/email/email-templates)。 + +また、Auth0 Actionsを使用して特定のイベントを設定することもできます。Actionsは、ランタイム中に実行される安全な関数です。Actionsはパイプラインの異なるポイントでトリガーされ、さまざまな用途があります。ユーザーがサインアップする前にメタデータを追加したり、ユーザーを外部サイトにリダイレクトしたりすることができます。Actionsができることの詳細については、以下をお読みください:[Auth0 Actionsの仕組みを理解する](https://auth0.com/docs/customize/actions/actions-overview)。 + +### セキュリティ + +悪意のある攻撃はいつでも起こる可能性があります。Auth0はいくつかの攻撃保護オプションを提供しています。例えば、ボット検出をGoogle reCAPTCHA Enterpriseと組み合わせてサイバー攻撃を防ぐことができます。ボット検出の設定の詳細については、以下をお読みください:[ボット検出](https://auth0.com/docs/secure/attack-protection/bot-detection)。 + +独自のログインページを使用している場合でも、Auth0ダッシュボードで有効にできる他のセキュリティオプションがあります: + +* 漏洩パスワード検出 +* ブルートフォース攻撃保護 +* 不審なIPスロットリング + +漏洩パスワード検出は、盗まれた認証情報を持つ悪意のある行為者に対するセキュリティ対策です。ブルートフォース攻撃保護は、悪意のあるIPを自動的にブロックし、フラグが立てられたユーザーアカウントに通知を送信することで、ログイン試行回数を制限してターゲットとなるユーザーアカウントを保護します。不審なIPスロットリングは、ブルートフォース攻撃保護が終了した時点から機能し、急速なサインアップやログインを試みるIPアドレスからのトラフィックをブロックします。 + +その他のセキュリティ対策は、ユーザーの認証方法によって異なります。Universal Loginで多要素認証(MFA)を有効にすると、ユーザーは2つ以上の認証要素を提供する必要があります。Auth0では、未知のデバイスからのログインや、疑わしいIPアドレスからのログインなど、特定の状況下でMFAをトリガーするようにカスタマイズできます。MFAの設定の詳細については、以下をお読みください:[アダプティブMFA](https://auth0.com/docs/secure/multi-factor-authentication/adaptive-mfa)。 + +### デプロイとモニタリング + +Auth0インスタンスのテストが完了し、デプロイの準備ができたら、パブリッククラウドまたはプライベートクラウドのオプションを利用できます。利用可能なオプションについて詳しく知るには、[デプロイメントオプション](https://auth0.com/docs/deploy-monitor/deployment-options)をお読みください。マルチテナント対応の環境が必要な場合は、[AWS上のプライベートクラウド](https://auth0.com/docs/deploy-monitor/deploy-private-cloud/private-cloud-on-aws)について詳しく読むことができます。 + +デプロイメントを順調に進めるために、事前デプロイメントの推奨事項、デプロイメントチェックリスト、ベストプラクティス、一般的な修正、およびその他のヒントの形でガイダンスを提供し、デプロイメントをできるだけスムーズに行えるようサポートしています。 + +ユーザーを受け入れる準備ができた本番環境を確立したら、エラー追跡とアラートに注意を払うことができます。System Center Operations Managerを使用して監視し、イベントログを分析ツールにエクスポートすることで、トレンド、ユーザー行動、または問題に関する洞察を得ることができます。 diff --git a/main/ja/docs/quickstart/spa/angular/interactive.mdx b/main/ja/docs/quickstart/spa/angular/interactive.mdx new file mode 100644 index 0000000..e39670a --- /dev/null +++ b/main/ja/docs/quickstart/spa/angular/interactive.mdx @@ -0,0 +1,247 @@ +--- +title: Angular アプリケーションにログインを追加する +--- + + + 以下をご覧ください [Angular認証の例](https://developer.auth0.com/resources/guides/spa/angular/basic-authentication) ガイドでは、Angularでユーザー認証を実装する詳細な方法を説明しています。このガイドでは、サインアップボタンの作成、ルートガードの追加、AngularからプロテクトされたAPIを呼び出す方法について追加の詳細を提供しています。 + + +Auth0を使用すると、ほぼすべてのタイプのアプリケーションに迅速に認証を追加できます。このガイドでは、Auth0を統合し、認証を追加し、[Auth0 Angular SDK](https://github.com/auth0/auth0-angular)を使用してAngularアプリケーションでユーザープロファイル情報を表示する方法を示します。 + +このクイックスタートを使用するには、以下が必要です: + +* 無料のAuth0アカウントにサインアップするか、Auth0にログインします。 +* 統合したい動作するAngularプロジェクトがあること。または、ログイン後にサンプルアプリケーションを表示またはダウンロードすることもできます。 + + + + Auth0サービスを使用するには、Auth0ダッシュボードでアプリケーションを設定する必要があります。Auth0アプリケーションは、開発中のプロジェクトの認証をどのように設定したいかを構成する場所です。 + + ### アプリケーションの設定 + + インタラクティブセレクターを使用して、新しいAuth0アプリケーションを作成するか、統合したいプロジェクトを表す既存のアプリケーションを選択します。Auth0の各アプリケーションには、アプリケーションコードがSDKを通じてAuth0 APIを呼び出すために使用する英数字の一意のクライアントIDが割り当てられます。 + + このクイックスタートを使用して設定した設定は、自動的に[ダッシュボード](https://manage.auth0.com/#/)のアプリケーションに更新されます。ここで将来的にアプリケーションを管理できます。 + + 完全な設定を探索したい場合は、代わりにサンプルアプリケーションを表示できます。 + + ### コールバックURLの設定 + + コールバックURLは、ユーザーが認証した後にAuth0がリダイレクトさせたいアプリケーション内のURLです。設定されていない場合、ユーザーはログイン後にアプリケーションに戻されません。 + + + サンプルプロジェクトに従っている場合は、これを`http://localhost:4200`に設定します。 + + + ### ログアウトURLの設定 + + ログアウトURLは、ユーザーがログアウトした後にAuth0がリダイレクトさせたいアプリケーション内のURLです。設定されていない場合、ユーザーはアプリケーションからログアウトできず、エラーが表示されます。 + + + サンプルプロジェクトに従っている場合は、これを`http://localhost:4200`に設定します。 + + + ### 許可されるWebオリジンの設定 + + 許可されるWebオリジンは、認証フローにアクセスを許可したいURLです。これにはプロジェクトのURLが含まれている必要があります。適切に設定されていない場合、プロジェクトは認証トークンを静かに更新できなくなり、ユーザーは次回アプリケーションを訪れたりページを更新したりした際にログアウトされてしまいます。 + + + サンプルプロジェクトに従っている場合は、これを`http://localhost:4200`に設定します。 + + + + + Auth0は[Angular SDK](https://github.com/auth0/auth0-angular)を提供しており、AngularアプリケーションでのAuth0認証と認可の実装プロセスを簡素化します。 + + ターミナルで以下のコマンドを実行して、Auth0 Angular SDKをインストールします: + + `npm install @auth0/auth0-angular` + + SDKは、モジュールや認証サービスを含む、AngularアプリケーションでAuth0を慣用的に統合するのに役立ついくつかの型を公開しています。 + + + + SDKは`provideAuth0`をエクスポートしています。これはSDKが機能するために必要なすべてのサービスを含む提供関数です。これをアプリケーションに登録するには: + + 1. ファイルを開きます。`main.ts `ファイル。 + 2. 関数を`provideAuth0 `パッケージからインポートします。`@auth0/auth0-angular `パッケージ。 + 3. を`provideAuth0 `内の`providers `に追加してアプリケーションに追加します。`bootstrapApplication`。 + 4. を`AuthService `に注入します。`AppComponent`。 + + 関数は`provideAuth0`プロパティと`domain`を取ります。`clientId`これらのプロパティの値は、Auth0に登録したシングルページアプリケーション(SPA)の**ドメイン**と**クライアントID**の値に対応します。これらは**設定**で見つけることができます。さらに、`authorizationParams.redirect_uri`を設定します。これにより、Auth0は認証が成功した後、ユーザーを特定のURLにリダイレクトすることができます。 + + + Auth0で[カスタムドメイン](https://auth0.com/docs/custom-domains)、domainプロパティの値は「設定」タブに反映されている値ではなく、カスタムドメインの値になります。 + + + + + Auth0 ApplicationとAuth0 Angular SDKを設定したので、次はプロジェクトにログインを設定する必要があります。これを行うには、SDKの`loginWithRedirect()`メソッドを`AuthService`クラスから使用して、ユーザーをAuth0 Universal Loginページにリダイレクトし、Auth0が認証を行います。ユーザーが正常に認証されると、このクイックスタートの前半で設定したコールバックURLにアプリケーションにリダイレクトされます。 + + アプリケーションに選択時に`loginWithRedirect()`を呼び出すログインボタンを作成します。 + + + ##### チェックポイント + + これで、アプリケーションにログインできるはずです。 + + アプリケーションを実行し、ログインボタンを選択します。以下を確認してください: + + * ユーザー名とパスワードを使用してログインまたはサインアップできる。 + * アプリケーションが[Auth0 Universal Login](https://auth0.com/universal-login)ページにリダイレクトする。 + * 認証のためにAuth0にリダイレクトされる。 + * 認証後、Auth0が正常にアプリケーションに戻りリダイレクトする。 + * Auth0に関連するエラーがコンソールに表示されない。 + + + + + プロジェクトにログインするユーザーには[ログアウトする方法](https://auth0.com/docs/logout/guides/logout-auth0)も必要です。SDKは`logout()`メソッドを`AuthService`クラスで提供しており、これを使用してアプリからユーザーをログアウトさせることができます。ユーザーがログアウトすると、[Auth0ログアウトエンドポイント](https://auth0.com/docs/api/authentication?javascript#logout)にリダイレクトされ、そこからすぐにアプリケーションと、このクイックスタートの前半で設定したログアウトURLにリダイレクトされます。 + + アプリケーションに選択時に`logout()`を呼び出すログアウトボタンを作成します。 + + + SDKは`isAuthenticated$`オブザーバブルを`AuthService`クラスで公開しており、これを使用してユーザーが認証されているかどうかを確認できます。`isAuthenticated$`オブザーバブルの値に基づいて、ログインボタンとログアウトボタンを条件付きでレンダリングできます。あるいは、単一のボタンを使用して、ログインとログアウトの両方のボタンとその条件付きレンダリングを組み合わせることもできます。 + + + + ##### チェックポイント + + これで、アプリケーションからログアウトできるはずです。 + + アプリケーションを実行し、ログインしてからログアウトボタンを選択します。以下を確認してください: + + * Auth0のログアウトエンドポイントにリダイレクトされる。 + * Auth0が正常にアプリケーションと正しいログアウトURLに戻りリダイレクトする。 + * アプリケーションからログアウトされている。 + * Auth0に関連するエラーがコンソールに表示されない。 + + + + + ユーザーがログインとログアウトできるようになったので、次は認証されたユーザーに関連する[プロファイル情報](https://auth0.com/docs/users/concepts/overview-user-profile)を取得できるようにしたいでしょう。例えば、ログインしたユーザーの名前やプロフィール画像を表示してユーザーインターフェースをパーソナライズしたい場合があります。 + + Auth0 Angular SDKは、`user$`オブザーバブルを通じてユーザー情報を提供します。これは`AuthService`クラスによって公開されています。`user$`オブザーバブルにはユーザーのアイデンティティに関連する機密情報とアーティファクトが含まれているため、その可用性はユーザーの認証状態に依存します。幸いなことに、`user$`オブザーバブルは`isAuthenticated$`オブザーバブルがtrueの場合にのみ値を発行するように設定されているため、ユーザープロファイルデータにアクセスする前に手動で認証状態をチェックする必要はありません。 + + SDKはまた、`isAuthenticated$`オブザーバブルを`AuthService`クラスで公開しており、これを使用してユーザーが認証されているかどうかを確認できます。例えば、UIエレメントを表示するか非表示にするかを決定するのに使用できます。 + + インタラクティブパネルの`UserProfileComponent`コードを確認して、これらの関数の使用例を見てください。 + + + ##### チェックポイント + + これで、ユーザープロファイル情報を表示できるはずです。 + + アプリケーションを実行し、以下を確認してください: + + * ログイン後、ユーザー情報が正しく表示される。 + * ログアウト後、ユーザー情報が表示されない。 + + + + +## 次のステップ + +素晴らしい仕事です!ここまで来られたなら、アプリケーションでログイン、ログアウト、およびユーザープロファイル情報が動作しているはずです。 + +これでクイックスタートチュートリアルは終了ですが、まだまだ探索することがたくさんあります。Auth0でできることについてもっと学ぶには、以下をチェックしてください: + + + + Auth0テナントとアプリケーションの設定と管理方法を学ぶ + + + + このチュートリアルで使用されているSDKをより詳しく探索する + + + + Auth0の機能を拡張するために有効にできる統合を発見する + + + + + ```ts main.ts + import { bootstrapApplication } from '@angular/platform-browser'; + import { provideAuth0 } from '@auth0/auth0-angular'; + import { AppComponent } from './app.component'; + + bootstrapApplication(AppComponent, { + providers: [ + provideAuth0({ + domain: '{yourDomain}', + clientId: '{yourClientId}', + authorizationParams: { + redirect_uri: window.location.origin + } + }), + ] + }); + ``` + + ```ts login-button.ts + import { Component } from '@angular/core'; + import { AuthService } from '@auth0/auth0-angular'; + + @Component({ + selector: 'app-login-button', + template: '', + standalone: true + }) + export class LoginButtonComponent { + constructor(private auth: AuthService) {} + + login() { + this.auth.loginWithRedirect(); + } + } + ``` + + ```ts logout-button.ts + import { Component, Inject } from '@angular/core'; + import { AuthService } from '@auth0/auth0-angular'; + import { DOCUMENT } from '@angular/common'; + + @Component({ + selector: 'app-logout-button', + template: ` + + `, + standalone: true + }) + export class LogoutButtonComponent { + constructor( + @Inject(DOCUMENT) public document: Document, + private auth: AuthService + ) {} + + logout() { + this.auth.logout({ + logoutParams: { + returnTo: this.document.location.origin + } + }); + } + } + ``` + + ```ts user-profile.ts + import { Component } from '@angular/core'; + import { AuthService } from '@auth0/auth0-angular'; + + @Component({ + selector: 'app-user-profile', + template: ` +
    +
  • {{ user.name }}
  • +
  • {{ user.email }}
  • +
`, + standalone: true + }) + export class UserProfileComponent { + constructor(public auth: AuthService) {} + } + ``` +
diff --git a/main/ja/docs/quickstarts.mdx b/main/ja/docs/quickstarts.mdx new file mode 100644 index 0000000..a581f0e --- /dev/null +++ b/main/ja/docs/quickstarts.mdx @@ -0,0 +1,58 @@ +--- +title: クイックスタート +description: Auth0 をアプリケーションに素早く統合するためのステップバイステップガイド +--- + +## 通常のWebアプリ + +サーバー上で動作する従来のWebアプリ + + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + +## シングルページアプリケーション + +ブラウザで動作するシングルページアプリケーション + + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + + } horizontal /> + diff --git a/main/ja/docs/troubleshoot/debugging-best-practices.mdx b/main/ja/docs/troubleshoot/debugging-best-practices.mdx new file mode 100644 index 0000000..a0b2072 --- /dev/null +++ b/main/ja/docs/troubleshoot/debugging-best-practices.mdx @@ -0,0 +1,71 @@ +--- +title: デバッグのベストプラクティス +--- + +## ルールのデバッグ + + + console.log()`consoleOut`プロパティは、アクション、ルール、フック、拡張機能、DBスクリプトを通じてAuth0プラットフォーム内で顧客が生成するログ出力です。 + + Auth0は、テストとデバッグ目的でのみ`consoleOut`console.log()プロパティの使用を推奨しています。個人データやその他の機密データをウェブコンソールにログ出力しないでください。ログ出力にそのようなデータが含まれてしまいます。 + + +通常、標準では、ルールを[実行時にデバッグする](https://auth0.com/docs/customize/rules/debug-rules)ことができます。これは`console.log`console.log()機能を使用してコンソールログを出力することで行います。詳細については、[MDN Web DocsのconsoleLog()に関するドキュメント](https://developer.mozilla.org/en-US/docs/Web/API/Console/log)を参照してください。Auth0プラットフォーム内でルールのインタラクティブなデバッグは利用できません(ただし、以下で説明するテスト自動化技術を外部のインタラクティブなソースデバッグ機能と組み合わせて使用することは可能です。詳細については、[ルールテストのベストプラクティス](https://auth0.com/docs/rules-best-practices/rules-testing-best-practices)を参照してください)。 + +## 行コメントを追加する + +十分な行(つまり、`//`//)またはブロック(つまり、`/* */`/\* \*/)コメントをルールに追加することは、特に明白でない機能の周りで、コードのデバッグと理解の両方に非常に価値があります。特に、ルールの最初の実装者が、将来的にそれを維持する責任を負う人物と同じでない場合が多いためです。 + +## リアルタイムWebtaskログ + +デフォルトでは、通常の実行中にコンソールログ出力は表示できません。ただし、[リアルタイムWebtaskログ拡張機能を使用](https://auth0.com/docs/customize/extensions/real-time-webtask-logs)して、ルールを含むAuth0テナント内のすべての実装された拡張性のすべてのコンソールログをリアルタイムで表示できます。この拡張機能が提供するリアルタイムコンソールログ表示には、すべての`console.log`console.log()`console.error`console.warn()`console.exception`console.error()出力が含まれます。詳細については、[MDN Web DocsのconsoleError()に関するドキュメント](https://developer.mozilla.org/en-US/docs/Web/API/Console/error)を参照してください。 + +## デバッグログの有効化と無効化 + +本番環境では、デバッグログを常時有効にすることは望ましくありません。ルールに関連するパフォーマンスの考慮事項を考えると、常時有効にすることは賢明ではありません。詳細については、[パフォーマンスのベストプラクティス](https://auth0.com/docs/troubleshoot/performance-best-practices)を参照してください。 + +しかし、開発またはテスト環境では、より継続的にデバッグログを有効にするオプションがはるかに望ましいです。さらに、過剰なデバッグログは大量の「ノイズ」を生成し、問題の特定をより困難にする可能性があります。 + +環境に応じてデバッグログを有効または無効にするようにルールを変更することは、煩雑でエラーが発生しやすくなります。詳細については、[ルール環境のベストプラクティス](https://auth0.com/docs/rules-best-practices/rules-environment-best-practices)を参照してください。代わりに、環境設定オブジェクトを利用して、以下のような方法で条件付き処理を実装できます: + +```js +function NPClaims(user, context, callback) { + /* + * This rule (https://auth0.com/docs/rules) is used to derive + * effective claims associated with the Normalized User Profile: + * https://auth0.com/docs/user-profile/normalized/auth0 + */ + var LOG_TAG = '[NORMALIZED_PROFILE_CLAIMS]: '; + var DEBUG = configuration.DEBUG ? console.log : function () {}; + DEBUG(LOG_TAG, "identities=", user.identities); + user.user_metadata = user.user_metadata || {}; + + // + user.family_name = + user.family_name || + user.identities.filter(function(identity) { + /* Filter out identities which do not have anything synonymous with + * Family Name + */ + return( + identity.profileData && + identity.profileData.family_name); + }).map(function(identity) { + return identity.profileData.family_name; + })[0]; + DEBUG(LOG_TAG, "Computed user.family_name as '", user.family_name, "'"); + . + . + + // + return callback(null, user, context); + } +``` + +上記の例では、`DEBUG` 環境設定変数が作成されており、これは `true` または `false` に設定できます。これは実行環境(例:本番、テスト、開発)に応じて設定されます。この変数の設定は、デバッグログがいつ実行されるかを決定するために使用されます。さらに、`DEBUGLEVEL` 環境`configuration` 変数を作成することができ、これはデバッグログレベル(例:詳細、中程度、簡潔)を制御するために使用できます。 + +上記の例は、名前付き関数の宣言も示しています。便宜上、コンパクトでユニークな命名規則を使用して関数名を提供することで、診断分析に役立ちます。匿名関数を使用すると、例外的なエラー状況の結果として生成されるコールスタックを解釈するのが難しくなりますが、ユニークな関数名を提供することでこの問題に対処できます。詳細については、[エラー処理のベストプラクティス](https://auth0.com/docs/troubleshoot/error-handling-best-practices)をお読みください。 + +### 静的解析 + +Auth0 DashboardのルールエディタはAuth0 Dashboardは、基本的な構文チェックとルールのセマンティクス分析を提供します。しかし、上書き検出、ループ検出、脆弱性検出などのより複雑な静的コード分析の機能は提供されていません。これに対処するために、[JSHint](https://jshint.com/about/)、[SonarJS](https://www.sonarsource.com/products/codeanalyzers/sonarjs.html)、または[Coverity](https://www.synopsys.com/software-integrity/security-testing/static-analysis-sast.html)などのサードパーティツールの使用を検討し、デプロイメント自動化プロセスの一部としてルールテストと組み合わせて使用することを検討してください。詳細については、[デプロイメントのベストプラクティス](https://auth0.com/docs/deploy-monitor/deployment-best-practices)をお読みください。 diff --git a/main/ja/docs/troubleshoot/error-handling-best-practices.mdx b/main/ja/docs/troubleshoot/error-handling-best-practices.mdx new file mode 100644 index 0000000..605f046 --- /dev/null +++ b/main/ja/docs/troubleshoot/error-handling-best-practices.mdx @@ -0,0 +1,58 @@ +--- +title: エラー処理のベストプラクティス +description: APIコールから返されるエラー状態は、適切な方法で処理されなければなりません。これを怠ると、未処理の例外状況につながり、結果としてパイプラインの実行が早期に終了し、最終的に認証エラーが返されることになります。 +--- + +## エラーログを外部サービスに送信する + +異常な操作の可視性と診断を向上させるために、エラーイベントログを外部サービスに送信することをお勧めします。サブスクリプションプランで提供されるログ保持期間を超えてログイベントを保持および分析するには、[Auth0のログストリーミングを使用してください](https://auth0.com/docs/customize/log-streams)。DataDogやAWS EventBridgeなどのサービスを利用できます。また、Auth0 Marketplaceの[ログストリーミング](https://marketplace.auth0.com/features/log-streaming)セクションで外部サービスにログを送信する機能も提供しています。 + +## ルールでエラーオブジェクトを使用する + +ルールの実行時間には制約があります。詳細については、[カスタムデータベースアクションスクリプト実行のベストプラクティス](https://auth0.com/docs/authenticate/database-connections/custom-db/custom-database-connections-scripts/execution)をお読みください。この時間内にエラー状態からの回復が不可能(または可能性が低い)場合は、エラー状態を明示的に返す必要があります。これは、Node の`Error`オブジェクトのインスタンスを返すことで、ルールの実行を完了するだけです。例えば: + +`return callback(new Error('some description'));` + +詳細については、[Class: Error on nodejs.org](https://nodejs.org/api/errors.html#errors_class_error)をお読みください。 + +あるいは、Auth0固有の`UnauthorizedError`のインスタンスを返すこともできます。これにより、`unauthorized`エラー条件が、提供されたエラー説明とともに、認証を開始したアプリケーション(つまり、`/authorize`エンドポイントへのリダイレクトが開始されたアプリケーション)に返されます。これにより、アプリケーションは条件付きの再試行機能を提供でき、特定の条件に基づいてアクセスを拒否するルールを実装できます: + +`return callback(new UnauthorizedError('some description'), user, context);` + +## 意味のあるエラーコードの説明を使用する + +UnauthorizedError`UnauthorizedError`オブジェクトは提供された説明のみを返します。未認証エラー条件に対して特定の処理を行うために、説明に簡単にアクセスできるエラーコード情報を含めることをお勧めします。例えば: + +`'[00043] - my specific error description'`) + +## 例外処理 + +キャッチされていないJavaScript例外などの予期しないエラー条件は、パイプラインの実行が早期に終了する原因となり、最終的に認証エラーが返されることになります。 + +非同期操作を含む状況では、`catch`ハンドラを使用する必要があります。`Promise`オブジェクト処理を使用する場合。`Promise`オブジェクト処理は、非同期操作以外のエラー処理にも効果的です。以下に示すように、`Promise`オブジェクトを使用して、例えば同期関数呼び出しをラップすることで、プロミスチェーンなどを使用してカスケードエラー処理を実装しやすくなります。Promiseオブジェクトの詳細については、[MDN Web DocsのPromise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)をお読みください。プロミスチェーンの詳細については、[javascript.infoのPromisesを使用したエラー処理](https://javascript.info/promise-error-handling)。 + +```js +return new Promise(function(resolve, reject) { + jwt.verify( + token, + secret,{ + clockTolerance: 5}, + function(err, decoded) { + if (err) { + reject(err); + } else { + resolve(decoded); + } + }); + }); +``` + +あるいは、`try...catch`処理を使用して、同期操作中に発生するJavaScript例外を処理することができます。詳細については、[`try...catch`のMDN Web Docsを参照してください](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch)。このタイプの例外処理を設定すると、しばしばパフォーマンスコストが発生するため、慎重に使用する必要があります。ルールのパフォーマンスは可能な限り最適である必要があります。より実用的なアプローチは、例外が発生した後に処理するのではなく、例外の発生を防ぐ処理を実装することです。ベストプラクティスの詳細については、[パフォーマンスのベストプラクティス](https://auth0.com/docs/troubleshoot/performance-best-practices)を参照してください。 + +## ルールで初期化されていないオブジェクトを避ける + +初期化されていないオブジェクトを使用すると、例外が発生する可能性があります。オブジェクトの存在が疑わしい場合は、宣言の一部として初期化を含めることをお勧めします。例えば: + +`user.user_metadata = user.user_metadata || {}`) + +ルールにおいて、最初から例外の発生を防ぐ措置を講じることがベストプラクティスであり、通常、例外処理を実装するよりもパフォーマンスとリソース使用の面でコストが低くなります。 diff --git a/main/ja/index.mdx b/main/ja/index.mdx new file mode 100644 index 0000000..50c4e01 --- /dev/null +++ b/main/ja/index.mdx @@ -0,0 +1,140 @@ +--- +mode: custom +--- + +export function openSearch() { + document.getElementById('search-bar-entry').click(); +} + +
+
+ +
+

+ ようこそAuth0ドキュメントへ! +

+ +

どのようにお手伝いできますか?

+ +
+ +
+
+
+ +
+
構築を開始
+

アプリケーションタイプを選択して始めましょう

+ + + } href="/docs/quickstart/native"> + デバイス上でネイティブに動作するモバイルまたはデスクトップアプリ + 例:iOS、Android + + + } href="/docs/quickstart/spa"> + ブラウザで動作するJavaScriptウェブアプリ + 例:AngularJS + Node.js、React + + + } href="/docs/quickstart/webapp"> + サーバー上で動作する従来のウェブアプリ + 例:Express.js、ASP.NET + + + } href="/docs/quickstart/backend"> + Auth0で保護されたAPIまたはサービス + 例:Express.js API、ASP.NET API + + + +
Auth0について学ぶ
+ + + + + +

+ Auth0アイデンティティプラットフォームを利用して、アプリケーションに高度な認証と認可を追加します。複数のアイデンティティプロバイダーからユーザーを一元管理し、ブランド化されたシームレスなサインアップとログイン体験を提供します。最も複雑なセキュリティ要件にも対応できる高度なカスタマイズ性でアクセスを細かく制御します。 +

+ + + + 基本を学び、認証ソリューションの構築を開始します。 + + + + アプリケーションとAPIがユーザーまたはデバイスの身元を確認する方法を定義します。 + + + + ユーザーに関するカスタム詳細を保存および管理します。 + + + + + + 独自のブランディングを使用してAuth0をカスタマイズし、機能を拡張して固有のアイデンティティニーズを解決します。 + + + + 多要素認証を追加し、ボット、不審なIP、パスワード侵害からアプリケーションを守ります。 + + + + アプリケーション用にAuth0をデプロイし、システムの健全性とイベントを監視します。 + + + + 課題のトラブルシューティング、Auth0の様々なサポートレベルについて学び、ヘルプを得ます。 + + +
diff --git a/main/logo/dark.svg b/main/logo/dark.svg new file mode 100644 index 0000000..6d94054 --- /dev/null +++ b/main/logo/dark.svg @@ -0,0 +1 @@ + diff --git a/main/logo/light.svg b/main/logo/light.svg new file mode 100644 index 0000000..4afa4d5 --- /dev/null +++ b/main/logo/light.svg @@ -0,0 +1 @@ +