====== googleサインイン ====== Expo.Google.logInAsync を使ったGoogleサインイン。 ===== Error: cannot set promise - some async operation is still in progress ===== Error: cannot set promise - some async operation is still in progress SDK32になると、使えなくなった。 現在対応検討中。 それまでSDK31を使う。 ===== TypeError: Cannot read property 'Google' of undefined ===== error [TypeError: Cannot read property 'Google' of undefined] import Expo from "expo"は使えなくなった。 import * as Expo from "expo"を使う。 ===== 設定手順 ===== ==== Google認証情報作成(Google developers consoleで認証情報を作成) ==== [[https://console.developers.google.com/apis/dashboard|Google developers console]]で任意のプロジェクトを作成する。 認証情報画面を開き、認証情報を作成でOAuthクライアントIDを作成する。 {{:reactnative:expo:pasted:20190205-001345.png}} SHA-1 署名証明書フィンガープリントを発行する。 > openssl rand -base64 32 | openssl sha1 -c 発行したフィンガープリントを設定し、 パッケージ名にはhost.exp.exponentを設定する。 {{:reactnative:expo:pasted:20190205-001549.png}} 発行されたクライアントIDをアプリに設定する。 {{:reactnative:expo:pasted:20190205-001737.png}} ==== React のコード ==== === 認証 === try { const result = await Expo.Google.logInAsync({ androidClientId: androidClientId, scopes: ["profile", "email","https://www.googleapis.com/auth/spreadsheets"] }) if (result.type === "success") { console.log(result) this.setState({ signedIn: true, name: result.user.name, photoUrl: result.user.photoUrl, accessToken:result.accessToken, refreshToken:result.refreshToken, }) ・・・ === リフレッシュトークンを使ってアクセストークンを更新 === try { let url= "https://accounts.google.com/o/oauth2/token" let bodyString = JSON.stringify({ client_id:androidClientId , refresh_token:this.state.refreshToken , grant_type:"refresh_token" , }) const result = await fetch(url, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, body: bodyString }); let responseJson = await result.json(); if (responseJson.access_token !== undefined) { //ステート更新 this.setState({ accessToken : responseJson.access_token }) ・・・ === userinfo取得 === let userInfoResponse = await fetch('https://www.googleapis.com/userinfo/v2/me', { headers: { Authorization: `Bearer ${value}` }, }); let userInfo = await userInfoResponse.json(); console.log(userInfo) this.setState({ signedIn: true, name: userInfo.name, photoUrl: userInfo.picture }) ===== エラー1 (crash)===== apkにしたときオプションにbehavior:webだとクラッシュする。 systemだと内部ブラウザが立ち上がり、ログインしても何もかえってこない。 下記ドキュメントをよくみてみるとandroidStandaloneAppClientIdに変更する必要がる。 [[https://docs.expo.io/versions/v31.0.0/sdk/google/|Google]] ・androidClientId (string) -- The Android client id registered with Google for use in the Expo client app.   ⇒expoのデバッグ用 ・androidStandaloneAppClientId (string) -- The Android client id registered with Google for use in a standalone app.   ⇒apkを作るときにはこちらで設定する。 try { const result = await Expo.Google.logInAsync({ androidStandaloneAppClientId: androidClientId, scopes: ["profile", "email","https://www.googleapis.com/auth/spreadsheets"], behavior: 'web' }) if (result.type === "success") { ・・・ ===== エラー2 (redirect_uri_mismatch)===== エラー1の設定変更(androidStandaloneAppClientIdとbehaviorの変更)により、apkでも外部ブラウザにとぶようになるが、redirect_uriのエラーがでる場合がある。 expoのテストではパッケージ名に「host.exp.exponent」を設定していた箇所に、実際のアプリのパッケージ名を設定する。 下記の場合は「com.nekotype.expo.meomry2」 {{:reactnative:expo:pasted:20190216-140846.png}} redirect_uri=com.nekotype.expo.meomry2:/oauthredirect client_id=xxxxx.apps.googleusercontent.com response_type=code state=xxxx scope=profile email https://www.googleapis.com/auth/spreadsheets code_challenge=xxxx code_challenge_method=xx That’s all we know.