social-auth-setup — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited social-auth-setup (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Both providers require setup in three places:
app.json + Expo config)ios.bundleIdentifier)This is separate from your App ID — it's used for the OAuth redirect flow.
Your App Name Sign Incom.yourorg.appname.siwa (convention: bundle ID + .siwa)YOUR_PROJECT.supabase.cohttps://YOUR_PROJECT.supabase.co/auth/v1/callbackSign in with Apple - Your App.p8 file — one-time download, save itcom.yourorg.appname.siwa).p8 filenpx expo install expo-apple-authenticationapp.json:
{
"expo": {
"ios": {
"usesAppleSignIn": true
},
"plugins": ["expo-apple-authentication"]
}
}Usage:
import * as AppleAuthentication from "expo-apple-authentication";
import { supabase } from "@/lib/supabase";
const credential = await AppleAuthentication.signInAsync({
requestedScopes: [
AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
AppleAuthentication.AppleAuthenticationScope.EMAIL,
],
});
await supabase.auth.signInWithIdToken({
provider: "apple",
token: credential.identityToken!,
});Note: Apple only returns the user's name and email on the first sign-in. Store them immediately in your DB — they won't come back on subsequent logins.
Google has two overlapping systems that share the same console:
| Thing | Where | Purpose |
|---|---|---|
| OAuth Client ID | Google Cloud Console → APIs & Services → Credentials | Sign in with Google |
| Service Account | Google Cloud Console → IAM & Admin | Play Console API (EAS Submit) |
| Play Console API link | Play Console → Setup → API access | Connects Play Console to a Cloud project |
These must all be in the same Google Cloud Project. If your Play Console is linked to Project A but your OAuth credentials are in Project B, social login and Play submissions won't share the project and you'll have permission confusion.
Set up the Cloud project link first, before creating any credentials.
In the linked Google Cloud project:
supabase.co and your production domainemail and profilehttps://YOUR_PROJECT.supabase.co/auth/v1/callbackandroid.package from app.jsoneas credentials --platform androidios.bundleIdentifier from app.jsonnpx expo install @react-native-google-signin/google-signinapp.json — add the iOS client ID from Step 4:
{
"expo": {
"plugins": [
["@react-native-google-signin/google-signin", {
"iosUrlScheme": "com.googleusercontent.apps.YOUR_IOS_CLIENT_ID"
}]
]
}
}Usage:
import { GoogleSignin } from "@react-native-google-signin/google-signin";
import { supabase } from "@/lib/supabase";
GoogleSignin.configure({
webClientId: "YOUR_WEB_CLIENT_ID.apps.googleusercontent.com",
iosClientId: "YOUR_IOS_CLIENT_ID.apps.googleusercontent.com",
});
const { idToken } = await GoogleSignin.signIn();
await supabase.auth.signInWithIdToken({
provider: "google",
token: idToken!,
});For both providers, add your app's deep link scheme to Supabase allowed redirect URLs:
https://yourapp.com (production web)yourapp:// (mobile deep link — must match scheme in app.json)http://localhost:3000 (local development)app.json:
{
"expo": {
"scheme": "yourapp"
}
}Apple login works on simulator but not on device — Sign in with Apple requires a real device. It will always fail on simulator. Test on physical hardware before debugging further.
Apple only sends name/email once — On every subsequent sign-in, credential.fullName and credential.email are null. Save them to your DB on first sign-in:
if (credential.fullName?.givenName) {
await supabase.from("profiles").upsert({ id: userId, name: credential.fullName.givenName });
}Google sign-in fails: "Sign in is currently unavailable" — OAuth consent screen is in "Testing" mode and your email isn't added as a test user. Either add the email in Cloud Console → OAuth consent screen → Test users, or publish the consent screen.
Google Play Console API link: "SA not found" — The service account must exist in the same Google Cloud project that Play Console is linked to. If you created it in a different project, it won't appear. Create a new service account in the correct linked project.
`DEVELOPER_ERROR` on Android — SHA-1 fingerprint mismatch. The Android OAuth client ID was created with a different SHA-1 than the one EAS uses. Run eas credentials --platform android to get the current SHA-1, then update the Android OAuth client in Google Cloud Console.
Supabase callback URL rejected by Apple — The return URL must exactly match what's in the Services ID configuration, including https:// and no trailing slash. Re-check: https://YOUR_PROJECT.supabase.co/auth/v1/callback.
Google OAuth works on web but not mobile — Mobile uses the native client IDs (Android/iOS), not the web client ID. Make sure you created separate OAuth client entries for Android and iOS in Google Cloud Console and configured them in the app.
Play Console linked to wrong Google Cloud project — This cannot be undone. If you linked to the wrong project, you must use that project for all service accounts. Create the OAuth credentials there too to keep everything in one place.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.