map = new google.maps.Map(document.getElementById('map-div'), { gestureHandling: 'cooperative', center: {lat: -34.397, lng: 150.644}, zoom: 8 });
zipalign
apksigner
jarsigner
signingConfig
v1SigningEnabled false v2SigningEnabled false
android:extractNativeLibs="false"
NSString *lineAccessToken = self.lineAdapter.getLineApiClient.accessToken;
LineAuthManager authManager = LineSdkContextManager.getSdkContext().getAuthManager(); final String accessToken = authManager.getAccessToken().accessToken;
NSURL *url = [NSURL URLWithString:@"https:///verifyToken"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:@"application/json" forHTTPHeaderField:@"content-type"]; NSDictionary *token = @{@"token" : lineAccessToken}; NSError *error; NSData *requestBody = [NSJSONSerialization dataWithJSONObject:token options:kNilOptions error:&error]; [request setHTTPBody:requestBody]; GTMHTTPFetcher *fetcher = [GTMHTTPFetcher fetcherWithRequest:request]; [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { if (!error) { // レスポンスから Firebase カスタム認証トークンを抽出 // ・・・ } }];
HashMap<string, string=""> validationObject = new HashMap<>(); validationObject.put("token", accessToken); Response.Listener responseListener = new Response.Listener() { @Override public void onResponse(JSONObject response) { // レスポンスから Firebase カスタム認証トークンを抽出 // ・・・ } }; JsonObjectRequest fbTokenRequest = new JsonObjectRequest( Request.Method.POST, "https:///verifyToken", new JSONObject(validationObject), responseListener, errorListener); NetworkSingleton.getInstance(activity).addToRequestQueue(fbTokenRequest);</string,>
app.post('/verifyToken', (req, res) => { if (!req.body.token) { return res.status(400).send('Access Token not found'); } const reqToken = req.body.token; // アクセス トークンを検証するために LINE サーバーにリクエストを送信 const options = { url: 'https://api.line.me/v1/oauth/verify', headers: { 'Authorization': `Bearer ${reqToken}` } }; request(options, (error, response, body) => { if (!error && response.statusCode === 200) { const lineObj = JSON.parse(body); // なりすまし攻撃を防ぐために必ずトークンの channelId を確認 if ((typeof lineObj.mid !== 'undefined') && (lineObj.channelId === myLINEChannelId)) { // LINE サーバーによるアクセス トークンの検証が成功 // Firebase トークンを生成し、端末に返却 const firebaseToken = generateFirebaseToken(lineObj.mid); // LINE プロファイルで Firebase ユーザー プロファイルをアップデート updateUserProfile(reqToken, firebaseToken, lineObj.mid, () => { const ret = { firebase_token: firebaseToken }; return res.status(200).send(ret); }); } } const ret = { error_message:'Authentication error:Cannot verify access token.' }; return res.status(403).send(ret); }); } });
function generateFirebaseToken(lineMid) { var firebaseUid = 'line:' + lineMid; var additionalClaims = { provider:'LINE' }; return firebase.auth().createCustomToken(firebaseUid); }
[[FIRAuth auth] signInWithCustomToken:firebaseToken completion:^(FIRUser * _Nullable user, NSError * _Nullable error) { // ログイン結果の処理 // ・・・ }];
FirebaseAuth.getInstance() .signInWithCustomToken(firebaseToken) .addOnCompleteListener(new OnCompleteListener() { // ログイン結果の処理 // ・・・ });
// 新規スライドの作成(タイトルと本体のレイアウト) { "createSlide": { "slideLayoutReference": { "predefinedLayout":"TITLE_AND_BODY" } } }, // テキストボックスにテキストを挿入 { "insertText": { "objectId": titleID, "text":"Hello World!" } }, // テキストのパラグラフに箇条書き記号を追加 { "createParagraphBullets": { "objectId": shapeID, "textRange": { "type":"ALL" } } }, // テキスト「変数」をイメージで置換 { "replaceAllShapesWithImage": { "imageUrl": imageURL, "replaceMethod":"CENTER_INSIDE", "containsText": { "text": "{{COMPANY_LOGO}}" } } }