mirror of
https://github.com/supabase/supabase.git
synced 2026-10-11 20:35:07 +03:00
I noticed that the following comment appeared above code where intent was not to sign in user with email and password. // Sign in user with email and password This proposal adds relevant comments, to make code intent clearer.
508 lines
9.5 KiB
Plaintext
Executable File
508 lines
9.5 KiB
Plaintext
Executable File
---
|
|
id: client-libraries
|
|
title: Client Libraries
|
|
description: 'Supabase provides client libraries in several languages.'
|
|
---
|
|
|
|
|
|
import Tabs from '@theme/Tabs';
|
|
import TabItem from '@theme/TabItem';
|
|
|
|
|
|
The [Supabase Client](/docs/reference/javascript/supabase-client) makes it simple for developers to build secure and scalable products.
|
|
|
|
## Auth
|
|
|
|
|
|
Create new users using [`signUp()`](/docs/reference/javascript/auth-signup). By default, the user will need to verify their email address before logging in.<br/>
|
|
If confirmations are disabled the response will contain an access token and also a confirmed_at value, otherwise it will just contain a confirmation_sent_at attribute.
|
|
|
|
<Tabs
|
|
groupId="libraries"
|
|
defaultValue="js"
|
|
values={[{ label: 'JavaScript', value: 'js' },{ label: 'Python', value: 'py' },{ label: 'Dart', value: 'dart'}]}>
|
|
|
|
<TabItem value="js">
|
|
|
|
```js
|
|
const { error, data } = await supabase.auth.signUp({
|
|
email: 'example@email.com',
|
|
password: 'example-password',
|
|
})
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
<TabItem value="py">
|
|
|
|
```py
|
|
import os
|
|
from supabase_py import create_client, Client
|
|
|
|
url: str = os.environ.get("SUPABASE_TEST_URL")
|
|
key: str = os.environ.get("SUPABASE_TEST_KEY")
|
|
supabase: Client = create_client(url, key)
|
|
user = supabase.auth.sign_up(
|
|
email='example@email.com',
|
|
password='example-password',
|
|
)
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="dart">
|
|
|
|
```dart
|
|
import 'package:supabase/supabase.dart';
|
|
|
|
void main() async {
|
|
final client = SupabaseClient('supabaseUrl', 'supabaseKey');
|
|
|
|
// Sign up user with email and password
|
|
final response = await client
|
|
.auth
|
|
.signUp('example@email.com', 'example-password');
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
|
|
|
Existing users can log in using [`signIn()`](/docs/reference/javascript/auth-signin).
|
|
|
|
<Tabs
|
|
groupId="libraries"
|
|
defaultValue="js"
|
|
values={[{ label: 'JavaScript', value: 'js' },{ label: 'Python', value: 'py' },{ label: 'Dart', value: 'dart'}]}>
|
|
|
|
<TabItem value="js">
|
|
|
|
```js
|
|
const { error, data } = await supabase.auth.signIn({
|
|
email: 'example@email.com',
|
|
password: 'example-password'
|
|
})
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
<TabItem value="py">
|
|
|
|
```py
|
|
import os
|
|
from supabase_py import create_client, Client
|
|
|
|
url: str = os.environ.get("SUPABASE_TEST_URL")
|
|
key: str = os.environ.get("SUPABASE_TEST_KEY")
|
|
supabase: Client = create_client(url, key)
|
|
user = supabase.auth.sign_in(
|
|
email='example@email.com',
|
|
password='example-password'
|
|
)
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="dart">
|
|
|
|
```dart
|
|
import 'package:supabase/supabase.dart';
|
|
|
|
void main() async {
|
|
final client = SupabaseClient('supabaseUrl', 'supabaseKey');
|
|
|
|
// Sign in user with email and password
|
|
final response = await client
|
|
.auth
|
|
.signIn(email: 'example@email.com', password: 'example-password');
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
|
If there is an email, but no password passed to [`signIn()`](/docs/reference/javascript/auth-signin), the user will receive a magic link.
|
|
|
|
<Tabs
|
|
groupId="libraries"
|
|
defaultValue="js"
|
|
values={[{ label: 'JavaScript', value: 'js' },{ label: 'Python', value: 'py' },{ label: 'Dart', value: 'dart'}]}>
|
|
|
|
<TabItem value="js">
|
|
|
|
```js
|
|
const { error, data } = await supabase.auth.signIn({
|
|
email: 'example@email.com'
|
|
})
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
<TabItem value="py">
|
|
|
|
```py
|
|
import os
|
|
from supabase_py import create_client, Client
|
|
|
|
url: str = os.environ.get("SUPABASE_TEST_URL")
|
|
key: str = os.environ.get("SUPABASE_TEST_KEY")
|
|
supabase: Client = create_client(url, key)
|
|
user = supabase.auth.sign_in(
|
|
email='example@email.com'
|
|
)
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="dart">
|
|
|
|
```dart
|
|
import 'package:supabase/supabase.dart';
|
|
|
|
void main() async {
|
|
final client = SupabaseClient('supabaseUrl', 'supabaseKey');
|
|
|
|
// Sign in user with email and magic link
|
|
final response = await client
|
|
.auth
|
|
.signIn(email: 'example@email.com');
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
|
Third party logins are also handled through [`signIn()`](/docs/reference/javascript/auth-signin).
|
|
|
|
|
|
<Tabs
|
|
groupId="libraries"
|
|
defaultValue="js"
|
|
values={[{ label: 'JavaScript', value: 'js' },{ label: 'Python', value: 'py' },{ label: 'Dart', value: 'dart'}]}>
|
|
|
|
<TabItem value="js">
|
|
|
|
```js
|
|
const { user, error } = await supabase.auth.signIn({
|
|
// provider can be 'github', 'google', 'gitlab', or 'bitbucket'
|
|
provider: 'github'
|
|
})
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
<TabItem value="py">
|
|
|
|
```py
|
|
# Not yet implemented
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="dart">
|
|
|
|
```dart
|
|
import 'package:supabase/supabase.dart';
|
|
|
|
void main() async {
|
|
final client = SupabaseClient('supabaseUrl', 'supabaseKey');
|
|
|
|
final response = await client
|
|
.auth
|
|
.signIn(provider: Provider.github);
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
## Managing data
|
|
|
|
Since Postgres is a Relational database, the client makes it simple to query tables and fetch related data in one round-trip, using [`select()`](/docs/reference/javascript/select).
|
|
|
|
|
|
<Tabs
|
|
groupId="libraries"
|
|
defaultValue="js"
|
|
values={[{ label: 'JavaScript', value: 'js' },{ label: 'Python', value: 'py' },{ label: 'Dart', value: 'dart'}]}>
|
|
|
|
<TabItem value="js">
|
|
|
|
```js
|
|
const { data, error } = await supabase
|
|
.from('countries')
|
|
.select(`
|
|
name,
|
|
cities (
|
|
name
|
|
)
|
|
`)
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
<TabItem value="py">
|
|
|
|
```py
|
|
# Not yet implemented
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="dart">
|
|
|
|
```dart
|
|
import 'package:supabase/supabase.dart';
|
|
|
|
void main() async {
|
|
final client = SupabaseClient('supabaseUrl', 'supabaseKey');
|
|
|
|
// Query tables and fetch related data in one round-trip, using select()
|
|
final response = await client
|
|
.from('countries')
|
|
.select('name')
|
|
.execute();
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
|
You can do advanced [filtering](/docs/reference/javascript/using-filters) to extract only the data that you need.
|
|
|
|
|
|
<Tabs
|
|
groupId="libraries"
|
|
defaultValue="js"
|
|
values={[{ label: 'JavaScript', value: 'js' },{ label: 'Python', value: 'py' },{ label: 'Dart', value: 'dart'}]}>
|
|
|
|
<TabItem value="js">
|
|
|
|
```js
|
|
const { data, error } = await supabase
|
|
.from('cities')
|
|
.select('name, country_id')
|
|
.lt('country_id', 100)
|
|
.limit(10)
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
<TabItem value="py">
|
|
|
|
```py
|
|
# Not yet implemented
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="dart">
|
|
|
|
```dart
|
|
import 'package:supabase/supabase.dart';
|
|
|
|
void main() async {
|
|
final client = SupabaseClient('supabaseUrl', 'supabaseKey');
|
|
|
|
// When fetching data, use advanced filtering to only extract data, that you need.
|
|
final response = await client
|
|
.from('cities')
|
|
.select('name,country_id')
|
|
.lt('country_id', 100)
|
|
.limit(10)
|
|
.execute();
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
|
You can create data easily using [`insert()`](/docs/reference/javascript/insert).
|
|
|
|
|
|
|
|
<Tabs
|
|
groupId="libraries"
|
|
defaultValue="js"
|
|
values={[{ label: 'JavaScript', value: 'js' },{ label: 'Python', value: 'py' },{ label: 'Dart', value: 'dart'}]}>
|
|
|
|
<TabItem value="js">
|
|
|
|
```js
|
|
const { data, error } = await supabase
|
|
.from('cities')
|
|
.insert([
|
|
{ name: 'The Shire', country_id: 554 },
|
|
{ name: 'Rohan', country_id: 555 },
|
|
])
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
<TabItem value="py">
|
|
|
|
```py
|
|
# Not yet implemented
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="dart">
|
|
|
|
```dart
|
|
import 'package:supabase/supabase.dart';
|
|
|
|
void main() async {
|
|
final client = SupabaseClient('supabaseUrl', 'supabaseKey');
|
|
|
|
// Create data easily, using insert()
|
|
final response = await client
|
|
.from('cities')
|
|
.insert([
|
|
{ 'name': 'The Shire', 'country_id': 554 },
|
|
{ 'name': 'Rohan', 'country_id': 555 },
|
|
])
|
|
.execute();
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
|
## Realtime Changes
|
|
|
|
The Supabase client makes it simple to listen to realtime database changes, using [`subscribe()`](/docs/reference/javascript/subscribe).
|
|
|
|
|
|
<Tabs
|
|
groupId="libraries"
|
|
defaultValue="js"
|
|
values={[{ label: 'JavaScript', value: 'js' },{ label: 'Python', value: 'py' },{ label: 'Dart', value: 'dart'}]}>
|
|
|
|
<TabItem value="js">
|
|
|
|
```js
|
|
const mySubscription = supabase
|
|
.from('countries')
|
|
.on('*', payload => {
|
|
console.log('Change received!', payload)
|
|
})
|
|
.subscribe()
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
<TabItem value="py">
|
|
|
|
```py
|
|
# Not yet implemented
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="dart">
|
|
|
|
```dart
|
|
import 'package:supabase/supabase.dart';
|
|
|
|
void main() async {
|
|
final client = SupabaseClient('supabaseUrl', 'supabaseKey');
|
|
|
|
// Listen to realtime database changes, using subscribe()
|
|
final response = await client
|
|
.from('countries')
|
|
.on(SupabaseEventTypes.all, (payload) {
|
|
print('Something happenned: ${payload.eventType}');
|
|
})
|
|
.subscribe((String event, {String? errorMsg}) {
|
|
print('event: $event error: $errorMsg');
|
|
});
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
|
You can even [listen to Row Level changes](/docs/reference/javascript/subscribe#listening-to-row-level-changes).
|
|
|
|
|
|
<Tabs
|
|
groupId="libraries"
|
|
defaultValue="js"
|
|
values={[{ label: 'JavaScript', value: 'js' },{ label: 'Python', value: 'py' },{ label: 'Dart', value: 'dart'}]}>
|
|
|
|
<TabItem value="js">
|
|
|
|
```js
|
|
const mySubscription = supabase
|
|
.from('countries:id.eq.200')
|
|
.on('UPDATE', handleRecordUpdated)
|
|
.subscribe()
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
<TabItem value="py">
|
|
|
|
```py
|
|
# Not yet implemented
|
|
```
|
|
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="dart">
|
|
|
|
```dart
|
|
import 'package:supabase/supabase.dart';
|
|
|
|
void main() async {
|
|
final client = SupabaseClient('supabaseUrl', 'supabaseKey');
|
|
|
|
// You can even listen to Row Level changes
|
|
final response = await client
|
|
.from('countries:id.eq.200')
|
|
.on(SupabaseEventTypes.update, (payload) {
|
|
print('Something happenned: ${payload.eventType}');
|
|
})
|
|
.subscribe((String event, {String? errorMsg}) {
|
|
print('event: $event error: $errorMsg');
|
|
});
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
|
|
|
## Next steps
|
|
|
|
- View the [Client Docs](/docs/reference/javascript/supabase-client)
|
|
- Sign in: [app.supabase.io](https://app.supabase.io)
|