limited-bear-88249
01/29/2024, 11:59 PMchilly-king-10285
01/29/2024, 11:59 PMchilly-king-10285
01/29/2024, 11:59 PMlimited-bear-88249
01/30/2024, 8:27 AMchilly-king-10285
01/30/2024, 8:27 AMchilly-king-10285
01/30/2024, 8:28 AMbash ory create oauth2-client \ --grant-type authorization_code \ --response-type code \ --scope openid \ --token-endpoint-auth-method client_secret_post \ --redirect-uri <https://my-app.com/callback>
Replace <https://my-app.com/callback>
with the callback URL of your SPA. The client_secret_post
method is used for authentication. 2. Using Ory SDK: If you prefer to use the SDK, here's a JavaScript example: javascript import { Configuration, OAuth2Api } from "@ory/client" const ory = new OAuth2Api( new Configuration({ basePath: `https://${process.env.ORY_PROJECT_SLUG}.<http://projects.oryapis.com|projects.oryapis.com>`, accessToken: process.env.ORY_API_KEY, }), ) export async function createOAuth2Client() { await ory.createOAuth2Client({ oAuth2Client: { grant_types: ["authorization_code"], redirect_uris: ["<https://example.com>"], scope: "offline openid", token_endpoint_auth_method: "client_secret_post", }, }) }
Replace <https://example.com>
with the callback URL of your SPA. 3. Using REST API: You can also use the REST API to create an OAuth2 client. Refer to the [API documentation](https://www.ory.sh/docs/reference/api#tag/oAuth2/operation/createOAuth2Client) for more details. Remember to replace the URLs and other parameters with the actual values for your application. Also, ensure that your local Kratos/Hydra instance is running and accessible. Sources: - [Manage OAuth 2.0 and OpenID Connect clients](https://www.ory.sh/docs/hydra/guides/oauth2-clients) - [Create OAuth2 client](https://www.ory.sh/docs/hydra/guides/oauth2-clients#create-oauth2-client)limited-bear-88249
01/30/2024, 8:35 AMchilly-king-10285
01/30/2024, 8:35 AMchilly-king-10285
01/30/2024, 8:35 AMORY_SDK_URL
environment variable to point to your local Kratos/Hydra instance. Here's how you can do it: For macOS/Linux: bash export ORY_SDK_URL=<http://localhost:4433>
For Windows CMD: bash set ORY_SDK_URL=<http://localhost:4433>
For Windows Powershell: bash $Env:ORY_SDK_URL = "<http://localhost:4433>"
2. Use Ory CLI: Once the environment variable is set, you can use the Ory CLI to interact with your local Kratos/Hydra instance. For example, to get the version of your Kratos instance, you can use the kratos remote version
command. Please note that the port number (4433 in the example) might be different in your setup. Replace localhost:4433
with the actual address and port of your local Kratos/Hydra instance. Sources: - [Run your React app](https://www.ory.sh/docs/getting-started/integrate-auth/react#run-your-react-app) - [kratos remote](https://www.ory.sh/docs/kratos/cli/kratos-remote#kratos-remote)limited-bear-88249
01/30/2024, 9:14 AMchilly-king-10285
01/30/2024, 9:14 AMchilly-king-10285
01/30/2024, 9:14 AM<http://localhost:4202>
is trying to access resources from <http://127.0.0.1:4444>
, which is a different domain. Even though localhost
and 127.0.0.1
are technically the same machine, they are treated as different domains by the browser. To solve this issue, you need to configure your Ory Kratos instance to allow CORS from your application's domain. Here's how you can do it: 1. Enable CORS in Ory Kratos: In your kratos.yml
configuration file, you need to enable CORS and add your application's domain to the allowed_origins
list. Here's an example: yaml serve: public: cors: enabled: true allowed_origins: - <http://localhost:4202>
2. Use the Same Domain Consistently: Make sure that you use 127.0.0.1
or localhost
consistently across your configuration. Mixing up 127.0.0.1
and localhost
can cause issues as they are treated as separate domains by the browser. 3. Use Ory Tunnel for Local Development: If you're facing CORS errors during local development, you can use [Ory Tunnel](https://www.ory.sh/docs/getting-started/local-development) to solve them. Remember to replace <http://localhost:4202>
with the actual domain of your application. Sources: - [CORS Errors](https://www.ory.sh/docs/kratos/bring-your-own-ui/custom-ui-basic-integration#cors-errors) - [Setting Up CORS](https://www.ory.sh/docs/kratos/guides/setting-up-cors) - [Mixing up 127.0.0.1 and localhost](https://www.ory.sh/docs/kratos/debug/csrf#mixing-up-127001-and-localhost)limited-bear-88249
01/30/2024, 9:16 AMchilly-king-10285
01/30/2024, 9:16 AMchilly-king-10285
01/30/2024, 9:17 AMORY_SDK_URL
environment variable to point to your local Kratos/Hydra instance. Here's how you can do it: For macOS/Linux: bash export ORY_SDK_URL=<http://localhost:4433>
For Windows CMD: bash set ORY_SDK_URL=<http://localhost:4433>
For Windows Powershell: bash $Env:ORY_SDK_URL = "<http://localhost:4433>"
2. Run Your Local Instances: You can run your local Kratos and Hydra instances using Docker. Here's an example command to clone and run Ory Kratos locally: bash git clone --depth 1 --branch master <https://github.com/ory/kratos.git> cd kratos git checkout master git pull -ff docker-compose -f quickstart.yml -f contrib/quickstart/kratos/cloud/quickstart.yml up --build --force-recreate -d
3. Configure CORS: If your application is running on a different domain (even localhost
and 127.0.0.1
are considered different domains), you'll need to configure CORS in your Kratos/Hydra configurations to allow requests from your application's domain. 4. Use Ory Tunnel for Local Development: If you're facing CORS errors during local development, you can use [Ory Tunnel](https://www.ory.sh/docs/guides/cli/proxy-and-tunnel) to solve them. Remember to replace localhost:4433
with the actual address and port of your local Kratos/Hydra instance. Sources: - [Run your React app](https://www.ory.sh/docs/getting-started/integrate-auth/react#run-your-react-app) - [Running Ory Kratos and the Ory Oathkeeper identity and access proxy](https://www.ory.sh/docs/kratos/guides/zero-trust-iap-proxy-identity-access-proxy#running-ory-kratos-and-the-ory-oathkeeper-identity-and-access-proxy) - [CORS Errors](https://www.ory.sh/docs/kratos/bring-your-own-ui/custom-ui-basic-integration#cors-errors) - [Setting Up CORS](https://www.ory.sh/docs/kratos/guides/setting-up-cors) - [Mixing up 127.0.0.1 and localhost](https://www.ory.sh/docs/kratos/debug/csrf#mixing-up-127001-and-localhost)limited-bear-88249
01/30/2024, 12:03 PMchilly-king-10285
01/30/2024, 12:03 PMchilly-king-10285
01/30/2024, 12:03 PMX-Frame-Options: DENY
HTTP header set by Ory. This header tells the browser not to allow the page to be framed, which is why your iframe is being blocked. Ory discourages the use of iframes due to the potential security risks they pose, such as clickjacking, iframe injection, and iframe phishing. Additionally, browsers like Safari and Chrome have implemented features that block third-party cookies in iframe contexts, which can break authentication, CSRF-prevention, and sessions. If you're trying to check if a user is still logged in, consider using a different method. For example, you can use the Ory SDK or API to check the session status. Here's an example using the Ory SDK: javascript const express = require("express") const app = express() const { FrontendApi, Configuration } = require("@ory/client") const ory = new FrontendApi( new Configuration({ basePath: `https://${process.env.PROJECT_SLUG}.<http://projects.oryapis.com|projects.oryapis.com>`, }), ) app.get("/blog/posts", async function (req, res) { const authHeader = req.headers.authorization const hasAuthHeader = authHeader.startsWith("Bearer ") const sessionToken = hasAuthHeader ? authHeader.slice(7, authHeader.length) : null const session = await ory .toSession({ cookie: req.cookies.join("; "), xSessionToken: sessionToken, }) .catch((err) => { // Check the error to see if it's a 401 / 403 -> not logged in }) }) app.listen(3000, function () { console.log("Listening on <http://localhost:3000%22|http://localhost:3000">) })
This code checks for both the cookie and the token, meaning your API must handle both Ory Session Cookies and Ory Session Tokens. Sources: - [Troubleshoot iframe related issues](https://www.ory.sh/docs/troubleshooting/iframes) - [Check session status](https://www.ory.sh/docs/identities/sign-in/check-session-token-cookie-api)limited-bear-88249
01/30/2024, 12:05 PMchilly-king-10285
01/30/2024, 12:05 PMchilly-king-10285
01/30/2024, 12:05 PMcheckSession
method provided by the OIDC client to check if a user is still logged in. This method uses an iframe to silently authenticate the user, which can help to maintain a session or renew an expired access token. However, as mentioned earlier, Ory sets the X-Frame-Options: DENY
HTTP header, which prevents the page from being displayed in an iframe. This is a security measure to prevent clickjacking attacks. To work around this, you can use the prompt=none
parameter in the authentication request. This parameter allows the authorization server to check the session status without user interaction. If the user is still logged in, the server will return a new authorization code or access token. If the user is not logged in, the server will return an error. Here's an example of how to use the prompt=none
parameter: javascript const authUrl = new URL('<http://localhost:4444/oauth2/auth>'); authUrl.searchParams.append('client_id', 'your-client-id'); authUrl.searchParams.append('redirect_uri', '<http://localhost:4202/callback>'); authUrl.searchParams.append('response_type', 'code'); authUrl.searchParams.append('scope', 'openid'); authUrl.searchParams.append('prompt', 'none'); const iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = authUrl.toString(); document.body.appendChild(iframe); iframe.onload = function() { // Check the iframe content for an authorization code or an error };
Remember to replace 'your-client-id'
and '<http://localhost:4202/callback>'
with your actual client ID and redirect URI. Please note that this method requires the user's browser to support third-party cookies. Some browsers block third-party cookies by default, which can prevent the prompt=none
parameter from working correctly. Sources: - [OAuth 2.0 - Prompt Parameter](https://www.ory.sh/docs/hydra/oauth2#prompt) - [OpenID Connect - Authentication Request](https://www.ory.sh/docs/hydra/oauth2#authentication-request)limited-bear-88249
01/30/2024, 12:13 PMchilly-king-10285
01/30/2024, 12:13 PMchilly-king-10285
01/30/2024, 12:13 PMcheckSession
method is used to verify if a user's session is still active. This is typically done by making a request to a specific endpoint that returns the session status. In the context of Ory Kratos, you can use the /sessions/whoami
endpoint to check the session status. If the user has an active session, the system returns a 200 OK
response and the session payload. If the user doesn't have an active session, the system returns a 401 Unauthorized
response. Here's an example of how to use the checkSession
method with the Ory SDK: javascript import { Configuration, FrontendApi } from "@ory/client" const frontend = new FrontendApi( new Configuration({ basePath: `https://${process.env.ORY_PROJECT_SLUG}.<http://projects.oryapis.com|projects.oryapis.com>`, }), ) export async function checkSession(sessionId: string, token: string) { return await frontend.toSession({ xSessionToken: token, }) }
In this example, the checkSession
function sends a request to the /sessions/whoami
endpoint with the session token. The toSession
method of the FrontendApi
class is used to make the request. Please note that you need to replace https://${process.env.ORY_PROJECT_SLUG}.<http://projects.oryapis.com|projects.oryapis.com>
with the actual URL of your Ory Kratos instance, and provide the correct session token. Sources: - [Check session status](https://www.ory.sh/docs/identities/sign-in/check-session-token-cookie-api) - [Bring-your-own-ui > Integration basics > Session Checks Part 3](https://www.ory.sh/docs/kratos/bring-your-own-ui/custom-ui-basic-integration#session-checks)limited-bear-88249
01/30/2024, 12:15 PMchilly-king-10285
01/30/2024, 12:15 PMchilly-king-10285
01/30/2024, 12:15 PMsessionId
and token
are obtained when a user authenticates with the system. 1. Session ID: This is a unique identifier for the user's session. It's part of the session payload that's returned when a user authenticates. In the context of Ory Kratos, the session ID is included in the response from the /sessions/whoami
endpoint. 2. Token: This refers to the session token, which is issued when a user authenticates. The type of token issued depends on the client used for interaction. If the interaction is performed through a web browser, an Ory Session Cookie is issued. If the interaction is performed by a client other than a web browser (for example, a native mobile app), an Ory Session Token is issued. Here's an example of how to get the session ID and token: javascript import { Configuration, FrontendApi } from "@ory/client" const frontend = new FrontendApi( new Configuration({ basePath: `https://${process.env.ORY_PROJECT_SLUG}.<http://projects.oryapis.com|projects.oryapis.com>`, }), ) export async function authenticate(username: string, password: string) { const { data: session } = await frontend.initializeSelfServiceLoginWithoutBrowser() const { data: completedSession } = await frontend.completeSelfServiceLoginWithoutBrowser({ login: { password: password, identifier: username, }, }) // The session ID is available in the 'id' property of the session object const sessionId = completedSession.id // The session token is available in the 'session_token' property of the session object const sessionToken = completedSession.session_token return { sessionId, sessionToken } }
In this example, the authenticate
function sends a login request to the Ory Kratos server with the user's username and password. The server returns a session object that includes the session ID and session token. Please note that you need to replace https://${process.env.ORY_PROJECT_SLUG}.<http://projects.oryapis.com|projects.oryapis.com>
with the actual URL of your Ory Kratos instance, and provide the correct username and password. Sources: - [Session Management Overview](https://www.ory.sh/docs/kratos/session-management/overview) - [Successful login > API clients Part 2](https://www.ory.sh/docs/kratos/self-service/flows/user-login#api-clients)limited-bear-88249
01/30/2024, 12:17 PMchilly-king-10285
01/30/2024, 12:17 PMchilly-king-10285
01/30/2024, 12:18 PM/sessions/whoami
-Endpunkt zurückgegeben. Hier ist ein Beispiel, wie Sie die Session-ID erhalten können: javascript import { Configuration, FrontendApi } from "@ory/client" const frontend = new FrontendApi( new Configuration({ basePath: "<http://localhost:4000>", // Verwenden Sie Ihre lokale Ory Tunnel-URL baseOptions: { withCredentials: true, }, }), ) export function checkSession() { const [session, setSession] = useState<Session>(undefined) useEffect(() => { frontend // der Cookie wird automatisch mit der Anfrage gesendet .toSession() .then(({ data: session }) => { setSession(session) }) .catch((error) => { // Die Sitzung konnte nicht abgerufen werden // Dies könnte auftreten, wenn die aktuelle Sitzung abgelaufen ist }) }, []) return session ? ( <table> <tr> <th>Session ID</th> <th>Expires at</th> <th>Authenticated at</th> </tr> <tr id={session.id}> <td>{session.id}</td> <td>{session.expires_at || ""}</td> <td>{session.authenticated_at || ""}</td> </tr> </table> ) : ( <div>Loading session data...</div> ) }
In diesem Beispiel sendet die checkSession
-Funktion eine Anfrage an den /sessions/whoami
-Endpunkt mit dem Session-Token. Die toSession
-Methode der FrontendApi
-Klasse wird verwendet, um die Anfrage zu machen. Bitte beachten Sie, dass Sie <http://localhost:4000>
durch die tatsächliche URL Ihrer Ory Kratos-Instanz ersetzen und das korrekte Session-Token bereitstellen müssen. Quellen: - [Check session status](https://www.ory.sh/docs/identities/sign-in/check-session-token-cookie-api) - [Bring-your-own-ui > Integration basics > Session Checks Part 3](https://www.ory.sh/docs/kratos/bring-your-own-ui/custom-ui-basic-integration#session-checks)limited-bear-88249
01/30/2024, 12:27 PM{
"id": "invalid_request",
"error": {
"status": "OAuth2 Error",
"id": "invalid_request",
"message": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Logout failed because query parameter post_logout_redirect_uri is not a whitelisted as a post_logout_redirect_uri for the client.",
"code": 599
}
chilly-king-10285
01/30/2024, 12:27 PMchilly-king-10285
01/30/2024, 12:27 PMpost_logout_redirect_uri
parameter in your logout request. According to the error, the post_logout_redirect_uri
you provided is not whitelisted for the client. In OAuth2 and OpenID Connect, the post_logout_redirect_uri
is the URL to which the user is redirected after they log out. For security reasons, this URL must be whitelisted in the client's configuration. To fix this issue, you need to add the post_logout_redirect_uri
to the client's configuration. Here's how you can do it: 1. Find the Client Configuration: Locate the configuration for the client that's making the logout request. This is typically found in a configuration file or a database, depending on how you've set up Ory Hydra. 2. Add the Post Logout Redirect URI: In the client's configuration, find the post_logout_redirect_uris
field and add the post_logout_redirect_uri
to it. Here's an example: json { "client_id": "my-client", "post_logout_redirect_uris": [ "<http://my-url/logout-callback>" ] // Other client configuration... }
In this example, <http://my-url/logout-callback>
is the URL to which the user is redirected after they log out. Replace this with your actual post_logout_redirect_uri
. 3. Save the Client Configuration: Save the updated client configuration. The changes should take effect immediately. Please note that the post_logout_redirect_uri
must exactly match the URL in the logout request. Even a small difference, such as a trailing slash, can cause the request to fail. Sources: - [OAuth2 logout not working](https://www.ory.sh/docs/hydra/debug/logout) - [From Hydra: request is missing ... or otherwise malformed](https://www.ory.sh/docs/hydra/self-hosted/gitlab#from-hydra-request-is-missing--or-otherwise-malformed)