認証済み電話番号(Android)電話番号ヒント(Android)
Intelligent Tracking Prevention(ITP)ブラウザでの One Tap
macOS サポートの追加
認証済み電話番号
電話番号ヒント
ITP ブラウザの One Tap
ユーザーのコンバージョンの増加業界をリードするセキュリティパスワード管理に伴うリスクの削減専用のログインページや登録ページにリダイレクトせずにログインや登録を実現パーソナライズしたプロンプトによる重複アカウントの削減と再訪ユーザーの自動ログイン
macOS プラットフォーム拡張
サポートの終了予定
Android での Smart Lock for Passwords のサポート終了ウェブサイト向け Google ログインのサポート終了
Smart Lock for Passwords のサポート終了
ウェブサイト向け Google ログインのサポート終了
昨年、ウェブ アプリケーション用の Google ログイン JavaScript プラットフォーム ライブラリのサポート終了予定についてお知らせしました。
Google ログイン JavaScript プラットフォーム ライブラリは、2023 年 3 月 31 日に完全に提供を終了します。ウェブ アプリケーションへの影響を確認し、必要に応じて移行計画を立てていただくよう、改めてお願いします。
2022 年 4 月 30 日より、新規アプリケーションは Google Identity Services ライブラリを使う必要があります。既存のアプリケーションは、サポート終了日までプラットフォーム ライブラリを使い続けることができます。
サポートの終了による影響の有無と、Google Identity Services に移行する必要性を評価してください。 移行は 2023 年 3 月 31 日までに終えてください。この日をすぎると、プラットフォーム ライブラリはダウンロードできなくなり、非推奨の認可機能から Google API を呼び出すためにアクセス トークンを取得しているウェブ アプリケーションは、意図したとおりに動作しなくなります。
Google は、ウェブでユーザーの個人情報を守るために、アプリやサービスへのログインをデフォルトで安全なものにする取り組みを続けています。その実現に向けて、Identity API ファミリーの一員である Google Identity Services についてお知らせしました。これは、複数の ID サービスを 1 つのソフトウェア開発キット(SDK)にまとめたものです。先日、Google Identity Services ライブラリのアップデートをリリースし、OAuth 2.0 に基づいたユーザー認可とデータ共有の機能を追加しました。新しい Identity Services ライブラリでは、さまざまなセキュリティやプライバシーの改善が行われているため、古いプラットフォーム ライブラリのすべての機能との間に完全な下位互換性があるわけではありません。そのため、新しいライブラリへの移行とコードの変更が必要になります。
サポートの終了は、Google ログイン JavaScript プラットフォーム ライブラリを読み込んでいるウェブ アプリケーションと、JavaScript 用 Google API クライアント ライブラリでアクセス トークンを扱っているアプリケーションに影響します。
ウェブページで JavaScript モジュール apis.google.com/js/api.js または apis.google.com/js/client.js を使ってプラットフォーム ライブラリを読み込んでいる場合は、影響を受けますので、新しい Identity Services クライアント ライブラリを使うように既存の実装を更新する必要があります。
apis.google.com/js/api.js
apis.google.com/js/client.js
Google API クライアント ライブラリから gapi.client を使っているウェブ アプリケーションは、Google API を呼び出すためのアクセス トークンを扱う際に、まもなく非推奨となるプラットフォーム ライブラリの gapi.auth2 モジュールを暗黙的に読み込んで使用していますそのため、ウェブ アプリケーションを更新し、新しい Identity Services ライブラリを明示的に追加する必要があります。そのうえで、アクセス トークンのリクエストを管理するようにし、auth2 モジュールへの参照を、同等の機能を持つ新メソッドで置き換えます。
gapi.client
gapi.auth2
一連のアプリケーションやプラットフォームで別の手法を使って Google の認証や認可を行っている方もいるでしょう。以下は、今回のサポートの終了のお知らせの影響は受けません。
Android や iOS のネイティブ アプリ SDK Google の OAuth 2.0 または OpenID サービスを直接呼び出しているバックエンド プラットフォーム
新しい Identity Services ライブラリでは、認可機能と認証機能が明確に分かれています。
移行には、次の 2 つのガイドが役立ちます。
(1) ユーザーの認可と Google API で利用するアクセス トークンの取得をするために Google Identity Services に移行する (2) ユーザーの認証とログインをするために Google ログインから移行する
(1) ユーザーの認可と Google API で利用するアクセス トークンの取得をするために Google Identity Services に移行する
(2) ユーザーの認証とログインをするために Google ログインから移行する
認可(Google API を呼び出すため)と認証(ユーザーのアプリへのログインを管理するため)の両方を使っているウェブ アプリケーションもあるかもしれません。その場合は、両方の移行ガイドに従い、ウェブ アプリケーションでユーザーの認可フローと認証フローを確実に分離する必要があります。
2 つの移行ガイドは、新しい Identity Services ライブラリと古いライブラリの違い、変更点の内容、認証と認可を分離する方法、その変更がユーザーやコードベースに与える影響について理解できるように記述されています。
新しい Identity Services ライブラリに移行すると、さまざまな変更によるたくさんのメリットを活用できます。
ポップアップが表示されるので、ユーザーはリダイレクトされたり、サイトを離れたりすることなく、わかりやすい UX で安全にウェブ アプリケーションを認可できます。 デフォルトでプライバシーと制御が向上します。ユーザーは必要な場合にのみ個々のスコープを承認できるので、ウェブ アプリケーションと共有する機密データの範囲やタイミングが改善されます。 ID トークンとアクセス トークンという認証情報が分離されるので、ユーザーの ID とアプリケーションの機能を明確に区別できます。認証情報を分ける方が、リスクのレベルに応じた分離、管理、保存がしやすくなります。ID は、その人が誰かという情報のみを表すので、ユーザーの機密データを読み書きする機能のアクセス トークンと比べると、リスクのレベルは低くなります。 Chromium のプライバシー サンドボックスの変更と上位互換性があります。
この記事は、新しい Identity Services ライブラリによるプライバシー、セキュリティ、ユーザビリティの変更を簡潔にまとめたものです。さらに詳しい説明は、移行ガイドに掲載されています。
詳しい情報は、デベロッパー サイトに掲載されています。技術サポートを受けたい方は、Stack Overflow で google-oauth タグを確認してください。提案やフィードバックがある方は、gis-migration-feedback@google.com にメールをお送りください。
Google Identity Services(GIS)
Google が最優先しているのは、オンラインのユーザーの安全を守ることです。そのため、私たちは個人情報を安全に保つための新しいツールや機能の開発に継続的に取り組んでいます。
2021 年 8 月に、新しい Identity API ファミリーとして、Google Identity Services(GIS)をリリースしました。これは、複数の ID サービスを 1 つのウェブ ソフトウェア開発キット(SDK)にまとめたものです。この SDK には、Google でログインするためのボタンや、簡単に利用できる認証プロンプトである One Tap が含まれています。Google でログインと One Tap では、パスワードではなく、セキュア トークンを利用してサイトやアプリにログインします。
今回は、このひとつに統合された Google Identity Services SDK に認可機能が追加されたことをお知らせします。これにより、この ID ソリューション スイートの価値はさらに高まり、デベロッパーもこれまで以上にシンプルに実装できるようになります。
キャプション : 個々の同意オプションが表示された認可画面
新機能
アップデート版のライブラリでは、認証と認可の両方が「ワンストップ ショップ」としてデベロッパーに提供されます。認証では、新規ユーザーが登録をしたり、登録済みのユーザーがログインしたりできます。もう一方の認可では、ユーザーの同意のもと、デベロッパーが Google API を呼び出すアクセス トークンを受け取ることができます。
デベロッパーによる細かな制御を実現するため、新しい SDK では、認証と認可のタイミングを明確に分けることがサポートされています。そのため、サイトやアプリのニーズに応じて、認証と認可の呼び出しを 2 つの独立した別々のフローとして行うことができます。
メリット
新しい SDK には、ブラウザベースのポップアップ ダイアログが使われています。そのため、サイトやアプリを利用するユーザーの手間が減り、認証や認可のフローが効率化されて、ユーザー エンゲージメントが向上します。
加えて、期限切れアクセス トークンの自動更新を削除することにより、エンドユーザーが明示的にセッションを更新しなければならなくなるため、長時間持続するトークンが意図しない目的に使われることを防ぐことができ、フロー全般のセキュリティが向上します。
さらに、新しいライブラリを使うことで、複雑な組み込み作業が軽減され、開発にかかる時間や労力を最小限にとどめることができます。組み込み作業を一層シンプルにするため、簡単に使える記述済みのスクリプトも提供します。このコード スニペットは、コピーしてパートナー サイトに直接貼り付けて使うことができます。
Google の認証や認可のフローを利用するユーザーは、2 要素認証、パスワード回復フローなどの Google が誇る最先端のセキュリティ インフラストラクチャによるメリットを活用できます。また、認可機能が有効になっているすべてのサイトやアプリで、Google が検証済みであるという安心を得ることができます。
Google Identity Services(GIS)への移行の一環として、今後もソリューションの改善を続ける予定です。今年追加される新機能にご注目ください。
新しい Google Identity Services(GIS)ライブラリを活用するには、Google のデベロッパー サイトにアクセスし、[ 始めましょう ] ボタンをクリックして技術ドキュメントをご覧ください。
Google は、ウェブでユーザーの個人情報を守るために、アプリやサービスへのログインをデフォルトで安全なものにする取り組みを続けています。先日は、その実現に向けて、Identity API ファミリーの新たな一員である Google Identity Services についてお知らせしました。これは、複数の ID サービスを 1 つのソフトウェア開発キット(SDK)にまとめたものです。今回は、ログイン方法を減らし、ユーザー エクスペリエンスをシンプルにする取り組みの一環として、ウェブアプリ向けに提供していた JavaScript ベースの Google プラットフォーム ライブラリのサポートを 2023 年 3 月 31 日をもって完全に終了することをお知らせします。
サポートの終了は、Google Sign-in JavaScript ライブラリを使っているウェブアプリにのみ影響します。現在のウェブページで Google プラットフォーム ライブラリ(apis.google.com/js/platform.js)を読み込んでいる場合は、影響を受けるので、新しい Sign In With Google クライアント ライブラリに移行する必要があります。
apis.google.com/js/platform.js
アプリやプラットフォームでは、Google プラットフォーム ライブラリを使ってユーザーのログイン認証のみのフロー、データ共有のための認可フロー(ユーザーのカレンダーや写真の共有など)、またはその両方を同時にサポートできます。今回の移行は、認証フローと認可フローの両方が対象になります。
アプリやプラットフォームでは、Google が提供する複数の認証方法と認可方法を使うこともできます。以下は、今回のサポートの終了のお知らせには影響されません。
ユーザーのログインを改善するという継続的な取り組みの一環として、Sign In With Google 用の新たな JavaScript ライブラリをリリースしました。これまでの認証や認可の機能に加えて、ユーザーの視認性や信頼性を向上させ、ログインの手間を減らすことができる新たなユーザー エクスペリエンスも提供します。
新しい JavaScript ライブラリへの移行にはたくさんのメリットがありますが、その一部を紹介します。
ユーザーには次のように表示されます。
詳細は、Google Identity Services のプロダクトのお知らせをご覧ください。
詳しい情報は、デベロッパー サイトに掲載されています。技術サポートを受けたい方は、Stack Overflow で google-signin タグを確認してください。提案やフィードバックは、gis-migration-feedback@google.com にお送りください。
Google は日々、デフォルトで安全で、設計上プライベートなプロダクトを構築することを通して、ユーザーが自分のデータを管理できるようにすることに注力しています。しかし、一般的なオンラインのセキュリティ脆弱性は、Google のプロダクト以外の部分、すなわちオンライン アカウントに不適切なパスワードでログインすることによって生じています。データ漏洩によって毎日膨大な数のパスワードが漏れ出し、ユーザーの個人情報が危険にさらされています。Google が最優先しているのは、オンラインのユーザーの安全を守ることです。そこで私たちは、個人情報を安全に保つための新しいツールや機能の開発に継続的に取り組んでいます。
この度(元記事公開当時)、Google Identity Services という新しい一連の Identity API をリリースします。これは、複数の ID サービスを 1 つのソフトウェア開発キット(SDK)にまとめたものです。この SDK には、Google でログインするためのボタンや、簡単に利用できる新しい認証プロンプトである One Tap が含まれています。Google でログインと One Tap は、パートナーのウェブサイトやアプリにログインするのにパスワードではなく、安全なトークンを利用します。
この取り組みは、プライバシーやセキュリティを損なわない ID ソリューションを提供することを目的として始まりました。そして今回、それが実現できました。新しい Google Identity Services は、業界トップクラスの Google のセキュリティと、簡単なログインによる究極の利便性を組み合わせることで、ユーザーを安全に保ちつつ、新しいユーザーの獲得やリピーターのシームレスなログインを促進する体験を提供します。
One Tap は、先回り型のシームレスなログイン プロンプトで、ユーザーがウェブサイトやアプリを使ってパーソナライズされたコンテンツに安全にアクセスする際に役立ちます。従来のログインボタンとは異なり、One Tap はどんなページからでもプロンプトを表示できます。そのため、ユーザーをランディング ページにリダイレクトする必要はなく、ユーザーのナビゲーションの意図が妨げられることはありません。One Tap プロンプトは、ウェブサイトでは右上から下に向かって、モバイル デバイスでは下から上に向かってスライドして表示されます。ユーザーは、1 回タップするだけでログインや登録をすることができ、認証情報を覚えたり、パスワードを作成したりする必要はありません。パートナーは、この認証ソリューションを使って大きな成果を上げています。劇的に手間が少なくなることで、ウェブサイトやアプリでのユーザーのログイン率や登録率が増加しました。
Google Identity Services プロダクトは、クリック ジャッキングやピクセル トラッキングなどの脆弱性、その他の脅威からの保護も考慮されています。そのため、ユーザーは安心してウェブサイトやアプリを利用できます。すべての Google アカウントには、強固な不正利用対策や不正防止システムが適用されています。そのため、Google Identity Services を使うことで、重複アカウントや不正アカウントによるリスクを軽減でき、サポートの負荷も減少します。
さらに、Google でログインするためのボタンの改善版をロールアウトし、リピーターに対してユーザー固有の詳細情報を表示するようにしました。これにより、選択されるユーザー アカウントが表示されるようになります。Google でログインするボタンでは、ウェブ全体での UI/UX の整合性も向上しており、プラットフォーム全体で信頼性とセキュリティを向上することができます。
Google は、デベロッパーの実装プロセスを簡単にし、最低限のコードで実現できるように懸命に作業を進めています。ぜひこの新しい API スイートを使い、ビジネスの成長にお役立てください。新しい Google Identity Services の実装を始めるには、デベロッパー サイトで技術ドキュメントをご覧ください。技術サポートを受けたい方は、Stack Overflow で google-signin タグをチェックしてください。
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build();
google-services.json
FirebaseDatabase database = FirebaseDatabase.getInstance();
FirebaseOptions options = new FirebaseOptions.Builder() .setApplicationId("1:530266078999:android:481c4ecf3253701e") // Required for Analytics. .setApiKey("AIzaSyBRxOyIj5dJkKgAVPXRLYFkdZwh2Xxq51k") // Required for Auth. .setDatabaseUrl("https://project-1765055333176374514.firebaseio.com/") // Required for RTDB. .build(); FirebaseApp.initializeApp(this /* Context */, options, "secondary");
FirebaseApp
FirebaseDatabase.getInstance()
// Retrieve my other app. FirebaseApp app = FirebaseApp.getInstance("secondary"); // Get the database for the other app. FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(app);
.requestIdToken(getString(R.string.default_web_client_id))
{ "client_id": "56865680640-e8mr503bun5eaevqctn4u807q4hpi44s.apps.googleusercontent.com", "client_type": 3 },
AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null); FirebaseAuth.getInstance().signInWithCredential(credential); FirebaseApp app = FirebaseApp.getInstance("secondary"); FirebaseAuth.getInstance(app).signInWithCredential(credential);
Default Auth UID: 0960868722032022577213DA4EA8B7A1683D92B405DD Secondary Auth UID: 7h6XOeSxmkNsSseFJ1jU31WZHDP2
firebaseAuth.getCurrentUser().getToken(false /* forceRefresh */) .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { String token = task.getResult().getToken(); // Send this to the server. } });
FirebaseOptions options = new FirebaseOptions.Builder() .setServiceAccount(new FileInputStream("default-service-account.json")) .build(); FirebaseApp.initializeApp(options); FirebaseOptions secondaryOptions = new FirebaseOptions.Builder() .setServiceAccount(new FileInputStream("secondary-service-account.json")) .build(); FirebaseApp.initializeApp(secondaryOptions, "secondary");
// Verify the ID token using the default app. FirebaseAuth.getInstance().verifyIdToken(idToken) .addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(FirebaseToken decodedToken) { String uid = decodedToken.getUid(); System.out.println("User " + uid + " verified"); FirebaseApp app = FirebaseApp.getInstance("secondary"); String customToken = FirebaseAuth.getInstance(app).createCustomToken(uid); // TODO: Send the token back to the client! } });
FirebaseApp app = FirebaseApp.getInstance("secondary"); FirebaseAuth.getInstance(app).signInWithCustomToken(token);
Default Auth UID: 0960868722032022577213DA4EA8B7A1683D92B405DD Secondary Auth UID: 0960868722032022577213DA4EA8B7A1683D92B405DD
var config = { apiKey: "", authDomain: ".firebaseapp.com", databaseURL: "https://.firebaseio.com", storageBucket: ".appspot.com", messagingSenderId: "", }; var secondary = firebase.initializeApp(otherAppConfig, "secondary"); var secondaryDatabase = secondary.database();
// Alt: load from plist using |FIROptions(contentsOfFile:)| let options = FIROptions(googleAppID: googleAppID, bundleID: bundleID, GCMSenderID: GCMSenderID, APIKey: nil, clientID: nil, trackingID: nil, androidClientID: nil, databaseURL: databaseURL, storageBucket: nil, deepLinkURLScheme: nil) FIRApp.configure(withName: "secondary", options: fileopts) guard let secondary = FIRApp.init(named: "secondary") else { assert(false, "Could not retrieve secondary app") } let secondaryDatabase = FIRDatabase.database(app: secondary);
「たった半日で認証を実装することができました。以前は、独自のソリューションの作成には何週間もかかり、プロバイダの API に変更が発生するたびにアップデートしなければなりませんでした」- Amine Laadhari, Fabulous CTO
「Firebase Authentication は最低限の設定しか必要としないので、短時間で簡単にソーシャル アカウントへのサインアップが実装できました。コンソールで提供されるユーザー管理機能もすばらしく、簡単に認証システムを実装できました」- Marc Yeongho Kim, Malang Studio CEO 兼 創立者
getAccountName
getId
dependencies { compile 'com.google.android.gms:play-services-auth:9.0.0' }
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(serverClientId) .requestEmail() .build();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory) .setAudience(Arrays.asList(serverClientId)) .setIssuer("https://accounts.google.com") .build();
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(Scopes.DRIVE_APPFOLDER)) .requestServerAuthCode(serverClientId) .requestEmail() .build();
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load( JacksonFactory.getDefaultInstance(), new FileReader(PATH_TO_CLIENT_SECRET_FILE));
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(Scopes.DRIVE_APPFOLDER)) // The serverClientId is an OAuth 2.0 web client ID // Details at: https://developers.google.com/identity/sign-in/android/?utm_campaign=android_discussion_server_021116&utm_source=anddev&utm_medium=blogstart step 4 .requestServerAuthCode(serverClientId) .requestEmail() .build();
if (result.isSuccess()) { GoogleSignInAccount acct = result.getSignInAccount(); String authCode = acct.getServerAuthCode(); }
if
(result.isSuccess()) {
GoogleSignInAccount
acct = result.getSignInAccount();
String
authCode = acct.getServerAuthCode(); }
// Set path to the Web application client_secret_*.json file you downloaded from the // Google Developers Console: https://console.developers.google.com/project/_/apiui/credential // You can also find your Web application client ID and client secret from the // console and specify them directly when you create the GoogleAuthorizationCodeTokenRequest // object. String CLIENT_SECRET_FILE = "/path/to/client_secret.json"; // Be careful not to share this! String REDIRECT_URI = "/path/to/web_app_redirect" // Can be empty if you don’t use web redirects // Exchange auth code for access token GoogleClientSecrets clientSecrets = GoogleClientSecrets.load( JacksonFactory.getDefaultInstance(), new FileReader(CLIENT_SECRET_FILE)); GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest( new NetHttpTransport(), JacksonFactory.getDefaultInstance(), "https://www.googleapis.com/oauth2/v4/token", clientSecrets.getDetails().getClientId(), clientSecrets.getDetails().getClientSecret(), authCode, REDIRECT_URI) .execute(); String accessToken = tokenResponse.getAccessToken(); String refreshToken = tokenResponse.getRefreshToken(); Long expiresInSeconds = tokenResponse.getExpiresInSeconds(); // You can also get an ID token from the exchange result if basic profile scopes are requested // e.g. starting GoogleSignInOptions.Builder from GoogleSignInOptions.DEFAULT_SIGN_IN like the // sample code as used here: http://goo.gl/0Unpq8 // // GoogleIdToken googleIdToken = tokenResponse.parseIdToken();
// Set path to the Web application client_secret_*.json file you downloaded from the // Google Developers Console: https://console.developers.google.com/project/_/apiui/credential // You can also find your Web application client ID and client secret from the // console and specify them directly when you create the GoogleAuthorizationCodeTokenRequest // object.
String CLIENT_SECRET_FILE =
"/path/to/client_secret.json"
; // Be careful not to share this! String REDIRECT_URI =
"/path/to/web_app_redirect"
// Can be empty if you don’t use web redirects
// Exchange auth code for access token
GoogleClientSecrets
clientSecrets =
.load(
JacksonFactory
.getDefaultInstance(),
new
FileReader
(CLIENT_SECRET_FILE));
GoogleTokenResponse
tokenResponse =
GoogleAuthorizationCodeTokenRequest
(
NetHttpTransport
(),
"https://www.googleapis.com/oauth2/v4/token"
, clientSecrets.getDetails().getClientId(), clientSecrets.getDetails().getClientSecret(), authCode, REDIRECT_URI) .execute(); String accessToken = tokenResponse.getAccessToken(); String refreshToken = tokenResponse.getRefreshToken(); Long expiresInSeconds = tokenResponse.getExpiresInSeconds();
// You can also get an ID token from the exchange result if basic profile scopes are requested // e.g. starting GoogleSignInOptions.Builder from GoogleSignInOptions.DEFAULT_SIGN_IN like the // sample code as used here: http://goo.gl/0Unpq8 // // GoogleIdToken googleIdToken = tokenResponse.parseIdToken();
GoogleCredential credential = new GoogleCredential.Builder() .setTransport(new NetHttpTransport()) .setJsonFactory(JacksonFactory.getDefaultInstance()) .setClientSecrets(clientSecrets) .build(); credential.setAccessToken(accessToken); credential.setExpiresInSeconds(expiresInSeconds); credential.setRefreshToken(refreshToken);
GoogleCredential
credential =
.
Builder
() .setTransport(
()) .setJsonFactory(
.getDefaultInstance()) .setClientSecrets(clientSecrets) .build(); credential.setAccessToken(accessToken); credential.setExpiresInSeconds(expiresInSeconds); credential.setRefreshToken(refreshToken);
Drive drive = new Drive.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), credential) .setApplicationName("Auth Code Exchange Demo") .build(); File file = drive.files().get("appfolder").execute();
Drive
drive =
.getDefaultInstance(), credential) .setApplicationName(
"Auth Code Exchange Demo"
) .build();
File
file = drive.files().
get
"appfolder"
).execute();