loud-car-47842
04/09/2025, 9:03 AMbrief-egg-61061
04/09/2025, 9:04 AMbrief-egg-61061
04/09/2025, 9:04 AMreturn_to
URL is handled differently than in browser flows. When implementing social sign-in for native apps, you need to properly manage the redirection back to your app after authentication. When initializing a registration or login flow for native apps, you can specify a return_to
parameter which is the URL that the browser will redirect to after the authentication flow is completed. This URL should be configured to open your native app (using iOS Universal Links or Android App Links). Here's how the flow works: 1. You initialize a flow with the return_to
parameter pointing to your app's callback URL: GET /self-service/registration/api?return_to=<http://localhost:19006/Callback>
2. After the user completes authentication with the identity provider, Ory will redirect the browser to your specified return_to
URL with additional parameters. 3. In your callback handler, you can extract the necessary parameters from the URL to complete the authentication process. For native apps, you typically need to: 1. Ensure your return_to
URL is allowed in the Ory Console under "Branding" → "Browser redirects" [Browser redirects in Ory Console](https://console.ory.sh/projects/current/browser-redirects) 2. When the callback URL is opened in your app, you'll need to extract the session token exchange code from the URL parameters and use it to exchange for a session token. The implementation in React Native might look something like this (based on the Ory example): typescript // In your callback component // Extract the code from the URL const code = new URL(url).searchParams.get('code'); // Use the code along with the first part of the exchange code // (received during flow initialization) to get a session token exchangeSessionToken(firstPartOfCode, code) .then(session => { // Store the session and redirect to home screen });
Note that the return_to
URL itself is not returned to your callback - instead, the callback URL you specified as return_to
is where the browser redirects after authentication, with additional parameters that allow you to complete the authentication process. [Social sign-in for native apps](https://www.ory.sh/docs/kratos/social-signin/native-apps) provides more detailed information about implementing this flow.loud-car-47842
04/09/2025, 9:15 AMbrief-egg-61061
04/09/2025, 9:15 AMbrief-egg-61061
04/09/2025, 9:15 AMreturn_to
URL is different from the callback URL, you need to understand how these two URLs work together in the Ory authentication process. When implementing a native authentication flow, the return_to
URL is stored as part of the flow data and can be retrieved after the callback is processed. Here's how you can handle this scenario: 1. When initializing the flow, you specify both parameters: - The return_to
parameter indicates where the user should ultimately be redirected after the entire authentication process is complete - The callback URL is where the browser redirects immediately after identity provider authentication 2. After the browser redirects to your callback URL, you need to exchange the session token exchange code for a session token: typescript // In your callback handler // Extract the code from the URL const returnToCode = new URL(url).searchParams.get('code'); // Exchange the two parts of the code for a session token sdk.exchangeSessionToken({ init_code: initCode, // The first part received during flow initialization return_to_code: returnToCode // The part received in the callback }) .then(({ data }) => { // Now you can access the session and the original return_to URL // Store the session token // Redirect to the original return_to URL if needed });
The exchangeSessionToken
endpoint (GET /sessions/token-exchange
) is specifically designed for this purpose, taking both parts of the code and returning the session information along with any flow data that includes the original return_to
URL [Ory API Reference](https://www.ory.sh/docs/reference/api). This approach allows you to maintain the original destination URL (return_to
) throughout the authentication process, even when the immediate callback URL is different. If you're experiencing issues with the return_to
URL not being preserved, this could be related to known issues that have been addressed in Ory Network. There were previously issues with redirects in multi-domain setups and with return_to
parameters not being properly transferred between flows, which have been fixed in recent updates [Github Issue #218](https://github.com/ory/network/issues/218) and [Github Issue #352](https://github.com/ory/network/issues/352). Remember that relative URLs in the return_to
parameter are interpreted relative to the domain the flow started from, which is important in multi-domain setups.loud-car-47842
04/09/2025, 9:22 AMbrief-egg-61061
04/09/2025, 9:22 AMbrief-egg-61061
04/09/2025, 9:23 AMcontinue_with
field being null in your callback response. This could be related to a few different issues in Ory's authentication flows. Based on the knowledge sources, there are a few potential reasons for this issue: 1. Feature flag not enabled: The continue_with
transitions feature might not be enabled in your project. This feature is needed for proper flow transitions in native applications. As mentioned in the documentation: feature_flags: use_continue_with_transitions: true
This setting needs to be enabled in your Ory Identities configuration. For new projects, it should be enabled by default, but you might need to check your configuration [Account recovery and password reset](https://www.ory.sh/docs/kratos/self-service/flows/account-recovery-password-reset#native-recovery-flows). 2. Known issues with verification flows: There are documented issues with phone verification and flow transitions. For example, in GitHub issue #406, a user reported that when updating a phone number in settings, they received the verification code but didn't get the verification flow ID in the continue_with
field [Cannot Verify Phone](https://github.com/ory/network/issues/406). 3. Flow continuation issues: There's also a known issue where the return_to
parameter gets dropped when transitioning between flows, particularly when going from registration to verification [SPA flows do not continue with OAuth flow after registration](https://github.com/ory/network/issues/352). To troubleshoot this issue: 1. Check if you're using the latest version of Ory 2. Verify that the use_continue_with_transitions
feature flag is enabled in your configuration 3. Make sure you're using the correct API endpoints for your flow type (browser vs. native) 4. Check if you're dealing with a multi-step flow (like registration followed by verification) where the transition might not be properly handled If you could provide more details about your specific flow (login, registration, settings, etc.) and the exact API endpoints you're using, I might be able to give more targeted advice. Would you be able to share more information about your specific implementation and the exact flow you're trying to complete? [Cannot Verify Phone](https://github.com/ory/network/issues/406) [SPA flows do not continue with OAuth flow after registration](https://github.com/ory/network/issues/352)loud-car-47842
04/10/2025, 3:18 AMbrief-egg-61061
04/10/2025, 3:18 AMbrief-egg-61061
04/10/2025, 3:18 AMinit_code
and return_to_code
parameters work for the exchange session token endpoint in Ory's native authentication flow. ## Understanding the Session Token Exchange Parameters The /sessions/token-exchange
endpoint requires two parameters: 1. init_code
: This is the first part of the session token exchange code that you receive when initializing a registration or login flow with return_session_token_exchange_code=true
. 2. return_to_code
: This is the second part of the code that is returned in the callback URL as the code
parameter. According to the Ory API Reference: GET /sessions/token-exchange Parameters: - init_code: The part of the code return when initializing the flow. (Required) - return_to_code: The part of the code returned by the return_to URL. (Required)
[Ory API Reference](https://www.ory.sh/docs/reference/api) ## How to Get These Codes From the parameters you mentioned (state
, code
, and scope
): - The code
parameter in your callback URL is your return_to_code
- The init_code
is not one of these parameters - it was provided earlier in the flow Here's how the flow works: 1. When you initialize a native registration or login flow with return_session_token_exchange_code=true
, you receive a response that includes a session_token_exchange_code
field. This is your init_code
. 2. After the user completes authentication, they are redirected to your callback URL with parameters including code
(this is your return_to_code
). 3. You then use both codes together to exchange for a session token. The state
and scope
parameters are standard OAuth 2.0 parameters but are not used directly in the token exchange process with Ory. ## Implementation Example typescript // Step 1: Initialize the flow and store the session_token_exchange_code const response = await sdk.createNativeRegistrationFlow({ return_session_token_exchange_code: true }); const initCode = response.data.session_token_exchange_code; // Step 2: After callback, extract the code parameter const returnToCode = new URL(callbackUrl).searchParams.get('code'); // Step 3: Exchange for a session token const sessionResponse = await sdk.exchangeSessionToken({ init_code: initCode, return_to_code: returnToCode });
[Social sign-in for native apps](https://www.ory.sh/docs/kratos/social-signin/native-apps) Remember to securely store the init_code
between the initialization of the flow and the callback, as you'll need both parts to complete the authentication process.loud-car-47842
04/10/2025, 5:40 AMbrief-egg-61061
04/10/2025, 5:40 AMbrief-egg-61061
04/10/2025, 5:40 AMcode
parameter to obtain access, ID, and refresh tokens. The ID token contains claims about the user. GET /oauth2/token
2. Access the UserInfo endpoint: Once you have the access token, you can call the UserInfo endpoint to get additional user information: GET /.well-known/openid-configuration/userinfo
The UserInfo endpoint returns claims about the authenticated user, including standard claims like email, name, etc., as defined in the [Ory API Reference](https://www.ory.sh/docs/reference/api). 3. Configure data mapping: For social sign-in providers, you can customize which data is mapped from the provider to your identity schema using Jsonnet data mapping: selfservice: methods: oidc: config: providers: - id: generic provider: generic claims_source: userinfo # Use this to get claims from UserInfo endpoint
[Generic provider configuration](https://www.ory.sh/docs/kratos/social-signin/generic#additional-configuration) ## Troubleshooting If you're having issues with missing data in the callback: 1. Check that you've requested the appropriate scopes (e.g., openid
, email
, profile
) 2. Verify your data mapping configuration if using social sign-in 3. Ensure the claims_source
is set correctly (either id_token
or userinfo
) If you're experiencing redirect issues, make sure your callback URL is properly configured and allowed in the Ory Console under "Branding" → "Browser redirects". [Troubleshooting social sign-in](https://www.ory.sh/docs/troubleshooting/troubleshooting-social-sign-in)loud-car-47842
04/10/2025, 5:42 AMbrief-egg-61061
04/10/2025, 5:42 AMbrief-egg-61061
04/10/2025, 5:42 AMGET /self-service/login/flows?id={flow_id}
2. For native applications: After receiving the callback with the authorization code, you can exchange it for a session token and retrieve the flow information: GET /sessions/token-exchange?init_code={init_code}&return_to_code={return_to_code}
## What Additional Properties Are Available The flow object contains rich information about the OIDC authentication process, including: - `oauth2_login_request`: Contains details about the OIDC request including: - `challenge`: The identifier of the login request - `client`: Information about the OAuth 2.0 client - `oidc_context`: Contains optional information about the OpenID Connect request - `requested_scope`: The scopes requested by the client - `requested_access_token_audience`: The audience for the access token For example, the oidc_context
might include: json "oidc_context": { "acr_values": ["string"], "display": "page", "id_token_hint_claims": {}, "login_hint": "<mailto:user@example.com|user@example.com>", "ui_locales": ["en"] }
## Retrieving User Information If you're specifically looking for user information from the OIDC provider: 1. After obtaining the access token, you can call the UserInfo endpoint: GET /userinfo
This endpoint returns claims about the authenticated user as defined in the OpenID Connect specification, including: json { "birthdate": "1990-01-01", "email": "<mailto:user@example.com|user@example.com>", "email_verified": true, "family_name": "Doe", "given_name": "John", "name": "John Doe" }
The specific properties available will depend on the scopes you requested and what the identity provider supports. [Ory API Reference](https://www.ory.sh/docs/reference/api)loud-car-47842
04/10/2025, 10:26 AMbrief-egg-61061
04/10/2025, 10:27 AMbrief-egg-61061
04/10/2025, 10:27 AMloud-car-47842
04/10/2025, 10:35 AMbrief-egg-61061
04/10/2025, 10:35 AMbrief-egg-61061
04/10/2025, 10:36 AMory create oauth2-client --token-endpoint-auth-method none
This creates a public client suitable for native apps, which cannot securely store client secrets. ## Step 2: Initialize the Authentication Flow In your native app, initialize the authentication flow: typescript // Initialize the flow with return_session_token_exchange_code=true const response = await sdk.createNativeRegistrationFlow({ return_session_token_exchange_code: true, return_to: "<myapp://callback>" // Your app's custom URL scheme }); // Store this code securely - you'll need it later const initCode = response.data.session_token_exchange_code;
## Step 3: Construct the Authorization URL Build the authorization URL with PKCE (Proof Key for Code Exchange) for enhanced security: typescript const clientId = "your_client_id"; const { codeChallenge, codeVerifier } = await generatePKCES256(); const authorizationUrl = `https://$<http://PROJECT_SLUG.projects.oryapis.com/oauth2/auth?response_type=code&client_id=${clientId}&redirect_uri=myapp://callback&scope=openid&state=12345&code_challenge_method=S256&code_challenge=${codeChallenge}`;|PROJECT_SLUG.projects.oryapis.com/oauth2/auth?response_type=code&client_id=${clientId}&redirect_uri=myapp://callback&scope=openid&state=12345&code_challenge_method=S256&code_challenge=${codeChallenge}`;> // Launch the system browser to start the authorization flow Browser.openURL(authorizationUrl);
Make sure to store the codeVerifier
securely as you'll need it for token exchange. ## Step 4: Handle the Callback Configure your app to handle the custom URL scheme callback: typescript // In your callback handler component function handleCallback(callbackUrl) { // Extract the code parameter from the URL const url = new URL(callbackUrl); const returnToCode = url.searchParams.get('code'); // Close the browser window WebBrowser.maybeCompleteAuthSession(); // Exchange the code for a token exchangeToken(initCode, returnToCode); }
## Step 5: Exchange the Code for Tokens Exchange the authorization code for access and ID tokens: typescript async function exchangeToken(initCode, returnToCode) { try { // Exchange the two parts of the code for a session token const response = await sdk.exchangeSessionToken({ init_code: initCode, return_to_code: returnToCode }); // Store the session token securely await secureStorage.setItem('session_token', response.data.session_token); // Navigate to the authenticated area of your app navigation.navigate('Home'); } catch (error) { console.error('Token exchange failed:', error); } }
## Step 6: Configure Allowed Redirect URLs Ensure your custom URL scheme is allowed in the Ory Console: 1. Go to Branding → Browser redirects in the [Ory Console](https://console.ory.sh/projects/current/browser-redirects) 2. Add your custom URL scheme (e.g., <myapp://callback>
) to the allowed redirects ## Step 7: Access Protected Resources Use the access token to make authenticated API requests: typescript async function fetchProtectedResource() { const sessionToken = await secureStorage.getItem('session_token'); const response = await fetch('<https://api.example.com/protected>', { headers: { 'Authorization': `Bearer ${sessionToken}` } }); return response.json(); }
## Important Considerations 1. Security: Use PKCE for all native app flows to prevent code interception attacks. 2. Custom URL Scheme: Register a custom URL scheme in your app's manifest to handle callbacks. 3. Token Storage: Store tokens securely using platform-specific secure storage. 4. Session Management: Implement proper token refresh and session expiration handling. For more detailed information, refer to [Social sign-in for native apps](https://www.ory.sh/docs/kratos/social-signin/native-apps) and [OAuth2 authorization code flow](https://www.ory.sh/docs/oauth2-oidc/authorization-code-flow#examples). Would you like me to elaborate on any specific part of this implementation?loud-car-47842
04/10/2025, 10:37 AMbrief-egg-61061
04/10/2025, 10:37 AMbrief-egg-61061
04/10/2025, 10:38 AMgo go mod init <http://github.com/yourusername/ory-native-app|github.com/yourusername/ory-native-app> go get <http://github.com/ory/client-go@master|github.com/ory/client-go@master>
## Step 2: Initialize the Ory Client go package main import ( "context" "fmt" "os" ory "<http://github.com/ory/client-go|github.com/ory/client-go>" ) func main() { // Initialize the Ory client conf := ory.NewConfiguration() conf.Servers = ory.ServerConfigurations{{URL: "https://" + os.Getenv("ORY_PROJECT_SLUG") + ".<http://projects.oryapis.com|projects.oryapis.com>"}} client := ory.NewAPIClient(conf) // Your authentication flow code will go here }
## Step 3: Create a Native Login Flow go // Create a native login flow with session token exchange code flow, _, err := client.FrontendApi.CreateNativeLoginFlow(context.Background()). ReturnSessionTokenExchangeCode(true). ReturnTo("<yourapp://callback>"). Execute() if err != nil { fmt.Printf("Error creating login flow: %v\n", err) return } // Store this code securely - you'll need it later initCode := flow.SessionTokenExchangeCode fmt.Printf("Flow ID: %s\n", flow.Id) fmt.Printf("Init Code: %s\n", initCode)
## Step 4: Open the Browser for Authentication In Go, you'll need to open the system browser. You can use the os/exec
package: go import ( "os/exec" "runtime" ) func openBrowser(url string) error { var cmd *exec.Cmd switch runtime.GOOS { case "darwin": cmd = exec.Command("open", url) case "windows": cmd = exec.Command("rundll32", "url.dll,FileProtocolHandler", url) default: // "linux", "freebsd", etc. cmd = exec.Command("xdg-open", url) } return cmd.Start() } // Use it to open the authorization URL authURL := fmt.Sprintf("<https://%s.projects.oryapis.com/self-service/methods/oidc/auth/%s?provider=google>", os.Getenv("ORY_PROJECT_SLUG"), flow.Id) err = openBrowser(authURL) if err != nil { fmt.Printf("Error opening browser: %v\n", err) return }
## Step 5: Handle the Callback For a native app in Go, you'll need to set up a local HTTP server to handle the callback: go import ( "net/http" "net/url" ) func handleCallback() (string, error) { returnCodeChan := make(chan string) errChan := make(chan error) // Create a server to handle the callback server := &http.Server{Addr: ":8080"} http.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) { // Extract the code from the URL returnToCode := r.URL.Query().Get("code") if returnToCode == "" { errChan <- fmt.Errorf("no code parameter found in callback URL") return } // Return a success message to the browser w.Write([]byte("Authentication successful! You can close this window.")) // Send the code to the main goroutine returnCodeChan <- returnToCode // Shutdown the server go server.Shutdown(context.Background()) }) // Start the server go func() { if err := server.ListenAndServe(); err != http.ErrServerClosed { errChan <- err } }() // Wait for either the code or an error select { case returnToCode := <-returnCodeChan: return returnToCode, nil case err := <-errChan: return "", err } } // Call this function to wait for the callback returnToCode, err := handleCallback() if err != nil { fmt.Printf("Error handling callback: %v\n", err) return }
## Step 6: Exchange the Code for a Session Token go // Exchange the two parts of the code for a session token session, _, err := client.FrontendApi.ExchangeSessionToken(context.Background()). InitCode(initCode). ReturnToCode(returnToCode). Execute() if err != nil { fmt.Printf("Error exchanging session token: %v\n", err) return } // Store the session token securely sessionToken := session.SessionToken fmt.Printf("Session Token: %s\n", sessionToken)
## Step 7: Use the Session Token for Authentication go // Use the session token to authenticate API requests userInfo, _, err := client.FrontendApi.ToSession(context.Background()). XSessionToken(sessionToken). Execute() if err != nil { fmt.Printf("Error getting session info: %v\n", err) return } fmt.Printf("Authenticated as: %s\n", userInfo.Identity.Traits.(map[string]interface{})["email"])
## Complete Example Here's a more complete example that ties everything together: go package main import ( "context" "fmt" "net/http" "os" "os/exec" "runtime" ory "<http://github.com/ory/client-go|github.com/ory/client-go>" ) func main() { // Initialize the Ory client conf := ory.NewConfiguration() conf.Servers = ory.ServerConfigurations{{URL: "https://" + os.Getenv("ORY_PROJECT_SLUG") + ".<http://projects.oryapis.com|projects.oryapis.com>"}} client := ory.NewAPIClient(conf) // Create a native login flow flow, _, err := client.FrontendApi.CreateNativeLoginFlow(context.Background()). ReturnSessionTokenExchangeCode(true). ReturnTo("<http://localhost:8080/callback>"). Execute() if err != nil { fmt.Printf("Error creating login flow: %v\n", err) return } initCode := flow.SessionTokenExchangeCode fmt.Printf("Flow ID: %s\n", flow.Id) // Open the browser for authentication authURL := fmt.Sprintf("<https://%s.projects.oryapis.com/self-service/methods/oidc/auth/%s?provider=google>", os.Getenv("ORY_PROJECT_SLUG"), flow.Id) err = openBrowser(authURL) if err != nil { fmt.Printf("Error opening browser: %v\n", err) return } // Handle the callback fmt.Println("Waiting for authentication callback...") returnToCode, err := handleCallback() if err != nil { fmt.Printf("Error handling callback: %v\n", err) return } // Exchange the code for a session token session, _, err := client.FrontendApi.ExchangeSessionToken(context.Background()). InitCode(initCode). ReturnToCode(returnToCode). Execute() if err != nil { fmt.Printf("Error exchanging session token: %v\n", err) return } fmt.Println("Authentication successful!") fmt.Printf("Session Token: %s\n", session.SessionToken) // Use the session token userInfo, _, err := client.FrontendApi.ToSession(context.Background()). XSessionToken(session.SessionToken). Execute() if err != nil { fmt.Printf("Error getting session info: %v\n", err) return } fmt.Printf("Authenticated as: %+v\n", userInfo.Identity.Traits) } func openBrowser(url string) error { var cmd *exec.Cmd switch runtime.GOOS { case "darwin": cmd = exec.Command("open", url) case "windows": cmd = exec.Command("rundll32", "url.dll,FileProtocolHandler", url) default: cmd = exec.Command("xdg-open", url) } return cmd.Start() } func handleCallback() (string, error) { returnCodeChan := make(chan string) errChan := make(chan error) server := &http.Server{Addr: ":8080"} http.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) { returnToCode := r.URL.Query().Get("code") if returnToCode == "" { errChan <- fmt.Errorf("no code parameter found in callback URL") return } w.Write([]byte("Authentication successful! You can close this window.")) returnCodeChan <- returnToCode go server.Shutdown(context.Background()) }) go func() { if err := server.ListenAndServe(); err != http.ErrServerClosed { errChan <- err } }() select { case returnToCode := <-returnCodeChan: return returnToCode, nil case err := <-errChan: return "", err } }
This implementation follows the pattern described in the [Ory documentation for social sign-in for native apps](https://www.ory.sh/docs/kratos/social-signin/native-apps) but adapted for Go. Remember to configure your allowed redirect URLs in the Ory Console under "Branding" → "Browser redirects".loud-car-47842
04/10/2025, 10:44 AMbrief-egg-61061
04/10/2025, 10:44 AMbrief-egg-61061
04/10/2025, 10:44 AMGET /sessions/token-exchange
) requires two parameters: 1. init_code
: This is the first part of the session token exchange code that you receive when initializing a flow. 2. return_to_code
: This is the second part of the code that is returned in the callback URL. ## Where to get the init_code You get the init_code
when you first initialize a native registration or login flow with the return_session_token_exchange_code=true
parameter: go // In Go: flow, _, err := client.FrontendApi.CreateNativeLoginFlow(context.Background()). ReturnSessionTokenExchangeCode(true). ReturnTo("<yourapp://callback>"). Execute() // The init_code is in the response: initCode := flow.SessionTokenExchangeCode
This code is returned in the session_token_exchange_code
field of the flow response. You need to store this value securely until the callback is received. ## Where to get the return_to_code The return_to_code
is the code
parameter that's included in the callback URL when the user is redirected back to your application after authentication: go // In your callback handler: returnToCode := r.URL.Query().Get("code")
This is the authorization code that's passed to your callback URL after the user completes authentication with the identity provider. ## Complete Flow 1. Initialize a flow with return_session_token_exchange_code=true
2. Store the session_token_exchange_code
from the response (this is your init_code
) 3. Redirect the user to the authentication URL 4. When the user completes authentication, they're redirected to your callback URL 5. Extract the code
parameter from the callback URL (this is your return_to_code
) 6. Call the Exchange Session Token endpoint with both codes: go session, _, err := client.FrontendApi.ExchangeSessionToken(context.Background()). InitCode(initCode). ReturnToCode(returnToCode). Execute()
This will return a session token that you can use for authenticated requests. [Ory API Reference](https://www.ory.sh/docs/reference/api)loud-car-47842
04/13/2025, 4:06 PMbrief-egg-61061
04/13/2025, 4:06 PMbrief-egg-61061
04/13/2025, 4:06 PMgo // Go example flow, _, err := client.FrontendApi.CreateNativeLoginFlow(context.Background()). ReturnSessionTokenExchangeCode(true). ReturnTo("<yourapp://callback>"). Execute() // Store the init_code securely initCode := flow.SessionTokenExchangeCode
The key parameter here is ReturnSessionTokenExchangeCode(true)
, which tells Ory to include a session token exchange code in the response. [Ory API Reference](https://www.ory.sh/docs/reference/api) ### Step 2: Complete Authentication After initializing the flow, the user needs to authenticate. This typically involves: 1. Redirecting to an identity provider (for social sign-in) 2. Entering credentials (for password-based authentication) 3. Completing any required verification steps ### Step 3: Handle the Callback When authentication is complete, the user is redirected back to your application via the return_to
URL you specified. Extract the code
parameter from this URL: go // In your callback handler returnToCode := r.URL.Query().Get("code")
### Step 4: Exchange Codes for a Session Token Now, use both the init_code
(from step 1) and the return_to_code
(from step 3) to exchange for a session token: go session, _, err := client.FrontendApi.ExchangeSessionToken(context.Background()). InitCode(initCode). ReturnToCode(returnToCode). Execute() // The session token is in the response sessionToken := session.SessionToken
This call to the /sessions/token-exchange
endpoint will return a session token that you can use for authenticated requests. [Ory API Reference](https://www.ory.sh/docs/reference/api) ### Step 5: Use the Session Token Store the session token securely and use it for authenticated requests: go // Use the session token to authenticate API requests userInfo, _, err := client.FrontendApi.ToSession(context.Background()). XSessionToken(sessionToken). Execute()
## Important Considerations 1. Security: Store the session token securely using platform-specific secure storage. 2. Token Lifespan: Be aware that session tokens have an expiration time. 3. Custom URL Scheme: For mobile apps, register a custom URL scheme to handle callbacks. 4. Allowed Redirects: Configure your return_to
URL in the Ory Console under "Branding" → "Browser redirects". Unlike browser flows that use cookies, native flows use session tokens that you must explicitly include in API requests using the X-Session-Token
header or the xSessionToken
parameter in SDK methods. [Using Ory Session Token](https://www.ory.sh/docs/kratos/session-management/overview#using-ory-session-token) Would you like me to elaborate on any specific part of this process?loud-car-47842
04/14/2025, 10:46 AMbrief-egg-61061
04/14/2025, 10:46 AMbrief-egg-61061
04/14/2025, 10:46 AM{project-slug}.<http://projects.oryapis.com|projects.oryapis.com>
domain for the OIDC callback: 1. Update the base_redirect_uri
configuration: bash # Using Ory CLI ory patch identity-config <project-id> \ --add '/selfservice/methods/oidc/config/base_redirect_uri="<https://ory.example.org>"'
Alternatively, you can do this in the Ory Console: 1. Go to Authentication → Social Sign-In 2. Add your domain to the Base Redirect URI field After changing the base redirect URI, you need to update the redirect URL in your social sign-in provider's configuration to match your custom domain. [Set custom domain as redirect URL](https://www.ory.sh/docs/identities/sign-in/social-sign-in/redirect-url) ### Configuring Custom UI for OAuth2 Login and Consent If you want to customize the login and consent screens in the OAuth2 flow: 1. Download your current OAuth2 configuration: bash ory get oauth2-config --project <project-id> --workspace <workspace-id> --format yaml > config.yaml
2. Modify the URLs in the configuration file: yaml oauth2: # ... urls: consent: <http://localhost:3000/consent> error: /oauth2/fallbacks/error login: <http://localhost:3000/login> post_logout_redirect: /oauth2/fallbacks/logout
3. Update the configuration: bash ory update oauth2-config --project <project-id> --workspace <workspace-id> --file config.yaml
[Try out custom OAuth2 login and consent](https://www.ory.sh/docs/hydra/guides/custom-ui-oauth2#configure-ory-network) ### Important Considerations 1. Breaking existing connections: Changing the base_redirect_uri
will break previously existing social sign-in connections. You'll need to update the callback URL in each provider's configuration. 2. Redirect URL mismatch errors: If you encounter redirect_uri_mismatch
errors, ensure that the redirect URI in your provider's configuration exactly matches the one Ory is using. 3. Domain ownership: Some providers require you to prove ownership of the domain used in the redirect URI, which is why using a custom domain might be necessary. 4. Projects created before September 2022: If your project was created before September 2022 and you're experiencing issues, you might need to remove the base_redirect_uri
configuration: bash ory patch identity-config <project-id> \ --remove '/selfservice/methods/oidc/config/base_redirect_uri'
[Social sign-in troubleshooting](https://www.ory.sh/docs/troubleshooting/oidc-redirect-url-cname-OTA-092022-01) Would you like more specific information about modifying the callback URL for a particular provider or use case?loud-car-47842
04/14/2025, 10:51 AMbrief-egg-61061
04/14/2025, 10:51 AMbrief-egg-61061
04/14/2025, 10:51 AMhttp(s)://<domain-of-ory-kratos>:<public-port>/self-service/methods/oidc/callback/<social-signin-provider-id>
To modify this URL, you need to update your Kratos configuration: ### Step 1: Update the Public Base URL The callback URL is derived from your Kratos public base URL. Modify this in your kratos.yml
configuration file: yaml serve: public: base_url: <https://your-new-domain.com/>
You can also set this using an environment variable: SERVE_PUBLIC_BASE_URL=<https://your-new-domain.com/>
[Deploy Kratos to production](https://www.ory.sh/docs/kratos/guides/deploy-kratos-example#configure-user-interface) ### Step 2: Configure OIDC Providers Update the OIDC provider configuration in your `kratos.yml`: yaml selfservice: methods: oidc: config: providers: - id: generic # this is <provider-id> in the callback URL provider: generic client_id: your_client_id client_secret: your_client_secret issuer_url: <https://accounts.google.com> mapper_url: "base64://{YOUR_BASE64_ENCODED_JSONNET_HERE}" scope: - email enabled: true
The id
field determines the last part of the callback URL. [Social sign-in configuration](https://www.ory.sh/docs/self-hosted/kratos/configuration/oidc) ### Step 3: Update Provider Configuration After changing your callback URL, you must update the redirect URI in your social sign-in provider's configuration to match the new URL: <https://your-new-domain.com/self-service/methods/oidc/callback/generic>
### Step 4: Restart Kratos After making these changes, restart your Kratos service: service kratos restart
### Additional Configuration Options If you need more control over the callback URL, you can also set the base_redirect_uri
configuration: yaml selfservice: methods: oidc: config: base_redirect_uri: <https://your-new-domain.com>
This is particularly useful if you're running Kratos behind a proxy or in a complex network setup. Remember that changing the callback URL will break existing social sign-in connections, so you'll need to update all your provider configurations accordingly. Would you like more specific information about configuring a particular social sign-in provider with your self-hosted Kratos instance?