Я пишу свое расширение, меня очень порадовало недавно заявления гугла о том что всем очень нужно обновиться до третьей версии манифеста ради прайваси пользователей и улучшения производительности (ни то, ни другое не поменялось значительно).
Google анонсировали что с 17 января 2022 года новые расширения Manifest V2 больше не будут приниматься интернет-магазином Chrome. Разработчики по-прежнему могут отправлять обновления для существующих расширений версии 2 манифеста.
Начиная с января 2023 года браузер Chrome больше не будет запускать расширения Manifest V2. Разработчики больше не могут отправлять обновления для существующих расширений версии 2 манифеста.
Ничего с этим не поделаешь, пришлось идти обновлять. В целом процесс относительно безболезненный если бы не эта ситуация.
Теперь при попытке входа в аккаунт через Google, Facebook или Twitter возникает следующая ошибка.
This operation is not supported in the environment this application is running on. "location.protocol" must be http, https or chrome-extension and web storage must be enabled.
Как выглядел процесс входа изначально
Открываться страница options. Пользователь выбирает провайдера с которым нужно войти. Из страницы options отправляется message в background скрипт.
// background.js
authProvider = new firebase.auth.GoogleAuthProvider()
app.auth()
.signInWithPopup(authProvider)
.then((userCredential) => {
const user = firebase.auth().currentUser
dispatch({ type: SIGN_IN, payload: { error: 'success', signInLater: false, user } })
})
.catch((error: any) => {
console.error(error)
dispatch({ type: SIGN_IN, payload: { error: error.code, signInLater: false, } })
})
В версии manifest 2 background это обычная страница у которой есть доступ к window. В версии 3 background обязательно должен быть сервис воркер, соответственно мы не можем просто так вызывать signInWithCredential.
Рабочий вариант
В манифесте нужно добавить oauth2 client_id и разрешение на получение identity.
{
"name": "ExtensionName",
"version": "0.1",
"manifest_version": 3,
"key": "your_public_key",
"background": {
"service_worker": "dist/bgWrapper.js"
},
"permissions": [
"identity",
"identity.email"
],
"host_permissions": [
"<all_urls>"
],
"oauth2": {
"client_id": "your_client_id",
"scopes": [
"profile",
"email",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/userinfo.profile"
]
}
}
// background.js
chrome.identity.getAuthToken({}, (token) => {
let credential = firebase.auth.GoogleAuthProvider.credential(null, token)
app
.auth()
.signInWithCredential(credential)
.then((userCredential) => {
const user = firebase.auth().currentUser
dispatch({ type: SIGN_IN, payload: { error: 'success', user } })
})
.catch((error: any) => {
console.error(error)
dispatch({ type: SIGN_IN, payload: { error: error.code } })
})
})
}
Используйте API chrome.identity, чтобы получить токен Google OAuth, как описано в https://developer.chrome.com/apps/app_identity, а затем используйте этот токен для авторизации Firebase с помощью Auth.signInWithCredential().
Этот токен можно получить если у пользователя включена синхронизация в Google Chrome.
Key
Настройка аутентификации в расширениях Chrome - это своего рода проблема курицы и яйца. Вам нужен открытый ключ и идентификатор приложения Chrome для настройки файла manifest.json, но вы должны опубликовать его в магазине Chrome, чтобы получить его. Поэтому опубликуем любое приложение, чтобы получить их.
После публикации расширения нужно перейти в консоль разработчика перейти во вкладку "Пакет" и выбрать "Показать открытый ключ".
Client id
Что бы получить client_id нужно:
Перейти в Google Cloud Console
Выбрать нужный проект
Выбрать в меню слева APIs & Services > Dashboard > Credentials
Кликнуть Create Credentials > OAuth client ID
Application type выбрать chrome app
Application id это id из chrome store
Введите свой идентификатор клиента OAuth и открытый ключ вашего расширения.
Минусы такого решения
Работает только вход через google или email/пароль
Работает только если включена синхронизация в настройках самого браузера
Не получится использовать готовые компоненты по типу react-firebaseui
Плюсы
Можно логинить пользователей автоматически
Это официальный вариант, следовательно, отвалится после очередных изменений от гугла с меньшей вероятностью
Надеюсь что эта статья поможет кому-то не тратить кучу времени в пустую при обновлении.