最初に、この投稿の長さとやや暴言っぽいスタイルについてお詫び申し上げます。しかし、私が判断できる限り、Box はこのサイト以外に開発者の質問や懸念事項を提供する場所を提供していません。
「Authorize」の下のページhttp://developers.box.com/docs/に例があります。
URL の例
コールバックの例
YOUR_REDIRECT_URI?code=THE_AUTHORIZATION_CODE
サンプル URL で XMLHttpRequest (以下のコードを参照*) を使用すると、「このアプリでは Box アカウントにログインする必要があります」ページの HTML を含む応答が返されます。HTML ドキュメントを保存し、ブラウザーで開きます。ユーザーがパスワードを入力して [ログイン] をクリックすると、[このアプリは Box アカウントへのアクセス許可を要求しています] ページが表示されます。「許可」ボタンをクリックすると、ページは上記の例の「YOUR_REDIRECT_URI」にリダイレクトされます。
わかりました...今何ですか?私のアプリ (Firefox 拡張機能) はどのようにして "YOUR_REDIRECT_URI?code=THE_AUTHORIZATION_CODE" 文字列にアクセスしますか? ブラウザのロケーションバーに座っているだけです。私の redirect_url が、URL から認証コードを抽出する php または cgi スクリプトを実行する有効な URL である場合でも、私の拡張コードはどのようにそれを取得することになっていますか? 拡張機能はすべてクライアント側の JavaScript です。リダイレクト URL を気にする必要があるのはなぜですか? ユーザーは、セットアップ中にボックスのユーザー名/パスワードを私の拡張機能に提供します。OAuth 2 は、ユーザー名とパスワードをアクセス トークンと直接交換するために使用できる「パスワード」許可タイプを提供します。次のようなトークン リクエストをボックスでサポートすることはできません。
POST https://www.box.com/api/oauth2/token
grant_type=password&
username=USERNAME&
password=PASSWORD&
client_id=CLIENT_ID
これにより、ユーザーを完全に承認する必要がなくなります。ユーザーがすでに自分のユーザー名/パスワードを私の拡張機能に提供しているという事実は、承認を意味します。redirect_url を必須にすることは、私のような小規模な開発者に不当な義務を課すことになります。1 日あたり数千 (または数十万) の XMLHttpRequests を処理するために、安全なドメインを維持し、料金を支払う必要がありますか? 私の Firefox 拡張機能はオープン ソースであり、誰でも無料で利用できます。私には、その種のオーバーヘッドを支払うリソースがありません。ユーザーの便宜のために、拡張機能でボックス サポートを提供しています。Box には、これを行うインセンティブはありません (顧客を送り出す開発者に報酬を与えるアフィリエイト プログラムさえありません)。
また、box は (まだ) 新しい API のタグをサポートしていないようです。私の拡張機能は、この機能に大きく依存しています。タグのサポートが検討されていることをこのフォーラムの他の場所で読みましたが、これが実現することを確認する具体的なものは何も見ていません (そして、タイムリーに実装してテストできるようになります)。これは私にとって契約を破るものです。
認証リクエストを処理する JavaScript コード スニペット (Firefox の依存関係を含む):
var Cc = Components.classes; var Ci = Components.interfaces; var Cu = Components.utils; Cu.import("resource://gre/modules/NetUtil.jsm"); Cu.import("resource://gre/modules/FileUtils.jsm"); var username = "my_username"; var password = encodeURIComponent("my_password"); var client_id = encodeURIComponent("my_clientId"); var state = encodeURIComponent("authenticated"); var redirect_uri = encodeURIComponent("https://somebogusurl.com"); var apiURL = encodeURIComponent("https:www.box.com/api/oauth2/authorize?"); var response_type = "code"; var resultsFile = "C:\\Users\\CBaker\\Desktop\\Extension Development\\FEBE\\FEBE 8.0\\work\\results.html" var results, doc, tab; function go(){ var req = new XMLHttpRequest(); req.open('POST', 'https://www.box.com/api/oauth2/authorize?response_type=code&client_id='+client_id+'&state='+state+'&redirect_uri='+redirect_uri, true); req.onreadystatechange = function (aEvt) { if (req.readyState != 4 || req.status != 200) { alert("resStatus: "+resStatus); return false; } results = req.responseText; writeFile(resultsFile,results); openFile(resultsFile); }; req.send(null); return true; } function writeFile(filename,data){ var file = new FileUtils.File(filename); var ostream = FileUtils.openSafeFileOutputStream(file) var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance(Ci.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; var istream = converter.convertToInputStream(data); NetUtil.asyncCopy(istream, ostream, function(status) { if (!Components.isSuccessCode(status)) { // Handle error! return; } }); } function openFile(filename){ var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); var win = wm.getMostRecentWindow("navigator:browser"); win.openNewTabWith(resultsFile, this.docURL, null, null); return } go()