質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

1067閲覧

課金後のJavaScript機能の開放について

kazuki__

総合スコア28

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

0クリップ

投稿2020/07/29 01:01

編集2020/07/30 04:56

現在作成しているWebサービスに課金機能をつけようと思っています。
ユーザーに課金してもらった後に、JavaScriptの機能を開放するような処理を入れたいのですが、
例えば、課金前はpremium = falseみたいな変数を持っていて、課金後にはpremium = trueにして、この変数に応じて機能を提供するような実装にする場合、ブラウザのデバッグ機能で簡単にpremiumの変数を変更できてしまうと思います。

そうなると、課金していないユーザーが課金によって開放される機能を使用できてしまうため非常に問題です。
この問題を回避して安全に課金ユーザーにのみJSの機能を提供する方法をご存知の方がいらっしゃいましたらご教授いただけますと幸いです。
よろしくお願いいたします。

追記(2020.07.30):

システムの構成は、

  1. フロントをReact、バックエンドをDjango REST frameworkで作成
  2. Djangoのみで作成

のどちらかにしようと思っています。

ユーザー情報・認証や課金情報などはDjangoのモデルを作成し、そこで管理します。

H40831👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/29 01:43

なんでしょうか。その「課金したら解放されるJavaScriptの機能」 とは。
kazuki__

2020/07/29 02:01

すみません。具体的な機能については公開できないんですが、だいぶぼやかしていうと、ユーザーにアップロードしてもらったファイルに対する自動編集機能みたいなものです。 サーバー側での処理も可能と言えば可能なのですが、プライバシー保護の観点からクライアント側での処理を売りにしたいのです。
miyabi_takatsuk

2020/07/29 02:03

課金しているユーザーの特定方法は確立しているのでしょうか? その特定ができていなければそもそも破綻すると思います。
m.ts10806

2020/07/29 02:04

クライアントサイドの機能であるかぎり完全に隠蔽することはできませんが、強いてなら、課金ユーザーのみが閲覧できるページにして、そこに直にscriptタグで書いてしまうことで外部から参照は困難になるとは思います。
kazuki__

2020/07/29 02:09

課金ユーザーの特定については、サーバーサイドでログイン機能を作成して、ユーザー情報と課金情報を紐付けて管理しようと思っています。 > miyabi_takatsukさん
kazuki__

2020/07/29 02:30 編集

なるほど。そういった方法があるんですね。 「課金ユーザーのみが閲覧できるページ」の実装方法がパッと浮かばないので、調べてみます! 回答ありがとうございます! > m.ts10806さん
m.ts10806

2020/07/29 02:45

>実装方法がパッと浮かばないので ではどうやって「課金した」「課金してない」および、「ユーザー」を管理しようとしていたのでしょうか。 前提条件や要件をきちんと詰めていないまま中身をどうしようか考えても後々大きな後戻りが発生していつまでたってもゴールに近づかないと思います。
miyabi_takatsuk

2020/07/29 03:21

> サーバーサイドでログイン機能を作成 これがしっかりしているなら、 答えが見えるかと。 これなら、maisumakunさんの回答も実行できそうですし、 m.ts10806さんのご指摘も併せればだいぶセキュリティ担保できるかと。 ただし、サーバーサイド中心なら、です。 あくまでフロント中心で、サーバーサイドはAPI、となれば、ログインシステム自体が骨が折れますし(セキュリティを担保するならです)そこの部分をはっきりさせてから、の話だと思います。今回の質問は。
kazuki__

2020/07/29 03:30 編集

まさにm.ts10806さんが仰るとおりだと思います。 が、今の私の知識だと設定した要件が技術的に満たせるかどうかがわからないため、m.ts10806さんの回答や他の方の回答を参考にどの方法が最適か、またそもそも実現可能か、要件の変更が必要かを検証する段階だと捉えています。 なので、ご指摘の通り検証の結果によっては手戻りも発生する可能性があります。ただ、これも要件定義の作業の一部分と考えれば、工程としては進んでいないように見えますが、必ずしもゴールに近づいていないとは言えないと思っています。 ちなみに、 「課金した」「課金していない」についてはStripe APIから返ってくるレスポンスのstatusをチェック、そして「ユーザー」と紐付けてDBに保存する、「ユーザー」についてはDjangoでユーザーモデルを作成し、管理しようと考えています。 フロントはReact、バックエンドはDjango REST frameworkのように分けて実装しようと思っていたため、バックエンドのモデルの値に応じてページを出し分けるような実装がすぐには浮かびませんでした。 そのため中身の調査が必要だと判断した次第です。
kazuki__

2020/07/29 03:29

当初は「フロント中心で、サーバーサイドはAPI」というような構成にしようと思っていたのですが、皆さんの回答を見る限りmiyabi_takatsukさん仰るようにサーバーサイド中心で作るのが良さそうかなと思い始めています。 ご指摘ありがとうございます! > miyabi_takatsukさん
m.ts10806

2020/07/29 03:46

割りと、あと出しが多いですね。 前提や背景含めて自身が持ってる情報で出せるものは先に出しておいた方が良いですよ。 後だしはトラブルのもとです。書いてないことは誰にも伝わりません。
kazuki__

2020/07/29 04:15

確かにちょっと後出しの情報が多かったです。 すみませんでした。。 それにも関わらず質問に答えていただいてありがとうございました。 非常に助かりました!
miyabi_takatsuk

2020/07/29 06:13

特に > Djangoでユーザーモデルを作成し が抜けていたのは、もう情報不足すぎます。 先の回答がズレてしまうくらい重要な情報です。 なんだ、サーバーサイドで組むんじゃん、ってなったら、 先回答で懸念されている事がパーになりかねないレベルです。 今からでも遅く無いので、質問本文整理してください。 質問タグも適せんつけましょう。 今のままでは、JavaScriptでなんとかセキュリティも担保できないか? と捉えられてしまいます。
kazuki__

2020/07/30 04:45

確かにそうですね。 ご指摘ありがとうございます!
miyabi_takatsuk

2020/07/30 04:47

納得したなら、質問文修正しましょう。
guest

回答4

0

課金したユーザにだけ、当該機能を含んだJavaScriptファイルを送信するようにする、というのがいちばん確実です。

投稿2020/07/29 01:06

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuki__

2020/07/29 02:21

回答ありがとうございます!
guest

0

PHP等のサーバーサイド言語が使えると仮定します。
ここではPHPで個人的に良いと思う方法をご紹介します。

  • 1, PHPでログイン中かどうか判別するif文を書く
  • 2, if文がtrueなら、非公開領域にあるJSファイルをfile_get_contents()で取得
  • 3, 2で取得したJSをscriptタグで囲って出力

php

1<?php 2 3/* 4login_status() ログイン状態か判断する関数。ログイン中だったら返り値がtrue、未ログインならfalseが返り値になる。 5 6$only_login_user_js_path ログイン済みの人に実行させたい。JavaScriptファイル。非公開領域に配置しサーバー内絶対パスが入ってる。(ex. /home/user/script.js 7*/ 8 9if (login_status()) { 10 echo '<script>',file_get_contents($only_login_user_js_path),'</script>'; 11}

投稿2020/07/29 02:21

kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyoya0819

2020/07/29 02:22

「ログイン機能を実装する」とあるので、サーバーサイド言語でそれらを実装すると仮定し、サーバーサイド言語でJSをインライン出力できる方法を紹介しています。
kyoya0819

2020/07/29 02:23

yambejpさんもおっしゃっていますが、どちらにせよJSが漏れてしまったら元も子もないので、サーバーサイドで処理したほうが良いと思います。
kazuki__

2020/07/29 02:24

バックエンドはDjangoなんですが、Djangoにも同様の機能があるか調べてみます! 回答ありがとうございます!
kazuki__

2020/07/29 02:26

> どちらにせよJSが漏れてしまったら元も子もないので、サーバーサイドで処理したほうが良いと思います。 このコメントについてはホントに仰るとおりですね。。。
guest

0

ベストアンサー

課金はおいておいて、まずはログイン機能のついたサイトをつくってください
クライアントサイドのjsだけではできませんので、サーバーサイドのシステムが必須です。
ログイン情報にあわせてjsを稼働させます。

投稿2020/07/29 01:07

yambejp

総合スコア116734

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/07/29 01:08

ただし、ログインユーザーがjsをダウンロードして別の人に配布してしまえば jsソースの秘匿化自体はできません
kazuki__

2020/07/29 01:54

回答ありがとうございます。 すみません。書き漏らしていましたが、ログイン機能は作成する予定です。 ログイン情報にあわせてjsを稼働させる、というのはjsファイルをサーバーサイドで持っていて、課金ユーザーにのみjsファイルを送信するというような意味ですか? サーバーサイドで課金情報を持っていたとしても、そのtrue/falseをクライアント側で判定したら同じことですもんね。。。
yambejp

2020/07/29 02:07

js用のローダーをつくるということです。 js自体はクライアントからは直接参照できないところにおき セッション情報を元に許諾されたユーザーにのみjsを戻します たてとえばphpなら <scirpt src="loadjs.php?src=hogehoge.js"></scirpt> 的な書き方で、loadjs.php内でセッションのチェックをしてOKなら 隠してあるhogehoge.jsをよみとってユーザーに返します イメージローダーとかにもよく使いますね
kazuki__

2020/07/29 02:21

なるほど。こんな方法があるのは知りませんでした。 この方向で実現できそうか調べてみます! ありがとうございます!
guest

0

たとえばpremiumconstで定義すればpremiumの改変を防ぐことはできますが、
それをしたとしてもpremiumを参照して条件分岐している部分を、ごそっと改変しちゃえば対策はできてしまいます。

ブラウザのJavaScriptは性質的にそういう言語なので、
厳密に管理したい場合はサーバーサイドの知識が必要になります。

投稿2020/07/29 01:07

H40831

総合スコア975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/29 01:45

質問者認識済みのことを改めて書く必要はないのでは。 >ブラウザのデバッグ機能で簡単にpremiumの変数を変更できてしまう
kazuki__

2020/07/29 01:56

回答ありがとうございます。 やはり厳密に管理する場合はサーバーサイドで課金コンテンツを持つ必要があるのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問