loginToken
æ¿èªåŸãã¯ã©ã€ã¢ã³ãã¯çŸåšã®ãŠãŒã¶ãŒãæ¿èªããäžæããŒã¯ã³ãåãåããlocalStorageã«ä¿åãããŸãã
> localStorage.getItem("Meteor.loginToken") "eEg4T3fNPGLns7MfY"
å³å¯ã«èšãã°ãããã¯Meteor._locaStorageãªããžã§ã¯ãã«æ ŒçŽãããŸããããã¯ãããããµããŒããããã©ãŠã¶ãŒã®window.localStorageã®ã©ãããŒã§ãã
Accountsãªããžã§ã¯ãã䜿çšããŠãã®ããŒã¯ã³ãèŠã€ããããšãã§ããŸãã
Accounts._storedLoginToken()
åãããŒã¯ã³ããµãŒããŒã®Meteor.usersã³ã¬ã¯ã·ã§ã³ã«ä¿åãããŸãã
> Meteor.user().services.resume { "loginTokens": [ { "token":"DXC3BqekpPy97fmYs", "when":"2014-01-31T10:53:54.347Z" } ] }
ãã¡ããããã©ãŠã¶ã³ã³ãœãŒã«ã§ã¯ããã®ãã£ãŒã«ãã¯æ瀺çã«å ¬éãããŠããå Žåã«ã®ã¿äœ¿çšã§ããŸãã
ããŒã¯ã³ãšãŠãŒã¶ãŒIDã®ãã¢ãæã€ãã©ãŠã¶ãŒã¯ãèš±å¯ãããŠãããšèŠãªãããŸãã ããã確èªããã«ã¯ããã©ãŠã¶ãŒã«ãã°ã€ã³ããŠãçŸåšã®loginTokenãšuserIdãååŸããŸãã
localStorage.getItem("Meteor.loginToken"); localStorage.getItem("Meteor.userId");
次ã«ãããããå¥ã®ãã©ãŠã¶ãŒã«ã€ã³ã¹ããŒã«ããŸãã
localStorage.setItem("Meteor.loginToken", "'+loginToken+'"); localStorage.setItem("Meteor.userId", "'+userId+'");
ãã°ãããããšããã©ãŠã¶ã»ãã·ã§ã³ãæ¿èªãããŸãã
ããŒã¯ã³ã®å¯¿åœ
ããŒã¯ã³ã¯ããŠãŒã¶ãŒããã°ã¢ãŠããããããã©ã¡ãŒã¿ãŒã§æå®ãããã¿ã€ã ã¢ãŠããæéåãã«ãªããŸã§ååšããŸãïŒããã©ã«ãã¯60æ¥ã§ãïŒã
Accounts.config({loginExpirationInDays: 60})
ã³ã¬ã¯ã·ã§ã³ãå€æŽããããã®ã¯ã©ã€ã¢ã³ãç¹æš©ã®å¶é-ã«ãŒã«ã®èš±å¯ / æåŠ
ãµãŒãã¹ãµãããã¥ã¡ã³ããå€æŽããããšãããšããã©ãŠã¶ãããããè¡ãããšãã§ããŸããã
> Meteor.users.update({ _id: Meteor.userId() }, {$set: { "services.test": "test" } }) undefined update failed: Access denied
ããã¯ããµãŒããŒäžã®ãã®ããã¥ã¡ã³ããžã®ã¢ã¯ã»ã¹ãèš±å¯ / æåŠã«ãŒã«ã«ãã£ãŠå¶éãããŠããããã«çºç ããŸãã accounts-baseããã±ãŒãžãœãŒã¹ã§ãã®ã¡ã«ããºã ãã©ã®ããã«å®è£ ãããŠããããèŠãŠã¿ãŸãããã
Meteor.users.allow({ // clients can modify the profile field of their own document, and // nothing else. update: function (userId, user, fields, modifier) { // make sure it is our record if (user._id !== userId) return false; // user can only modify the 'profile' field. sets to multiple // sub-keys (eg profile.foo and profile.bar) are merged into entry // in the fields list. if (fields.length !== 1 || fields[0] !== 'profile') return false; return true; }, fetch: ['_id'] // we only look at _id. });
ã³ãŒããããuserIdãçŸåšã®ãŠãŒã¶ãŒãšäžèŽããããã¥ã¡ã³ããžã®å€æŽã®ã¿ãèš±å¯ããããããã¡ã€ã«ãµãããã¥ã¡ã³ãã®ã¿ãå€æŽã§ããããšãããããŸãã fetchãã©ã¡ãŒã¿ãŒã¯ãMeteorã«ãã¢ã¯ã»ã¹èš±å¯ã確èªããããã«ãå€æŽãããããã¥ã¡ã³ãå šäœãåä¿¡ããå¿ èŠã¯ãªãïŒå€§ããå ŽåãããïŒã1ã€ã®_idãã£ãŒã«ãã ãã§ååã§ããããšãäŒããŸãã ã«ãŒã«allowã¯æŽæ°æäœã«å¯ŸããŠã®ã¿å®£èšãããŠãããããã¯ã©ã€ã¢ã³ãã®æ¿å ¥ããã³åé€æäœã¯çŠæ¢ãããŠããŸãã
> Meteor.users.insert({}) "qs8HbcSDjgbgb3vgS" insert failed: Access denied. No allow validators set on restricted collection for method 'insert'.
æåŠã«ãŒã«ã«ãããallowã§èš±å¯ãããæäœãçŠæ¢ã§ããŸãã ã€ãŸããèš±å¯ã«ãŒã«ã®1ã€ïŒè€æ°ã®ã«ãŒã«ãèšå®ã§ããïŒãtrueãè¿ãå ŽåãæåŠã«ãŒã«ã®1ã€ãtrueãè¿ããšããã®èš±å¯ã¯ãªãŒããŒã©ã€ããããå¯èœæ§ããããŸãããã®å Žåãèš±å¯ã«ãŒã«ã«ããããããèšé²ã¯æåŠãããŸãã
ãµãããã¥ã¡ã³ãã®ã¢ã¯ã»ã¹æš©ã確èªãã
æŽæ°æäœã§ã¯ãæ€èšŒãªãã·ã§ã³ãå€å°å¶éãããŸãã ããšãã°ããµãããã¥ã¡ã³ãã®ãã£ãŒã«ãïŒããšãã°doc.field1ïŒãžã®æžã蟌ã¿ãçŠæ¢ããå¿ èŠãããããå¥ã®ãã£ãŒã«ãïŒããšãã°ãã³ã¬ã¯ã·ã§ã³ãã¹ãã®doc.field2ïŒã«å ¥ããããšãèš±å¯ããå¿ èŠãããå Žåãæ©èœããŸããã ãã®å Žåãã«ãŒã«ã«å ¥åãããèš±å¯ããã³æåŠã®åºåããµãŒããŒã«è¿œå ããŠãã©ã®ãã©ã¡ãŒã¿ãŒãã«ãŒã«ã«æž¡ãããã®ããèŠãŠã¿ãŸãããã
Test.allow({ update: function (userId, document, fields, modifier) { console.log('Test.allow(): userId:', userId, '; document:', document, '; fields:', fields, '; modifier:' , modifier); return true; } }); Test.deny({ update: function (userId, document, fields, modifier) { console.log('Test.deny(): userId:', userId, '; document:', document, '; fields:', fields, '; modifier:' , modifier); return false; } });
ãããŠãããã¥ã¡ã³ãã®1ã€ã®_idã以åã«èªèããŠãdoc.field1ãã£ãŒã«ãã®æŽæ°æäœãå®è¡ããŸãïŒãã®äŸã®ã³ãŒãã§ãããžã§ã¯ã·ã§ã³= {}å€æ°ãèšå®ããããšã§ããã¹ãã³ã¬ã¯ã·ã§ã³ã«å¿ èŠãªãã£ãŒã«ããå ¬éãããŠããããšã確èªããŠãã ãããããã§ãªãå Žåãçµæã¯è¡šç€ºãããŸããïŒïŒ
> Test.findOne({_id: "FG7FaQqYgB7Rs9RDy"}) Object {_id: "FG7FaQqYgB7Rs9RDy", name: "First", value: 1} > Test.update({_id:"FG7FaQqYgB7Rs9RDy"}, { $set: { "doc.field1": "value1" } } ) undefined > Test.findOne({_id: "FG7FaQqYgB7Rs9RDy"}) Object {_id: "FG7FaQqYgB7Rs9RDy", name: "First", value: 1, doc: Object} > Test.findOne({_id: "FG7FaQqYgB7Rs9RDy"}).doc.field1 "value1"
ãµãŒããŒãã°ã«ã¯æ¬¡ã衚瀺ãããŸãã
I20140131-13:31:27.582(4)? Test.deny(): userId: kL7Fkuk29ci4vz8q4 ; document: { _id: 'FG7FaQqYgB7Rs9RDy', name: 'First', value: 1 } ; fields: [ 'doc' ] ; modifier: { '$set': { 'doc.field1': 'value1' } } I20140131-13:31:27.582(4)? Test.allow(): userId: kL7Fkuk29ci4vz8q4 ; document: { _id: 'FG7FaQqYgB7Rs9RDy', name: 'First', value: 1 } ; fields: [ 'doc' ] ; modifier: { '$set': { 'doc.field1': 'value1' } }
fieldsãã©ã¡ãŒã¿ãŒã§ã¯ãæäžäœã¬ãã«ã®ãã£ãŒã«ãã®ããã·ãã®ã¿ãæž¡ãããŸããã€ãŸããããã«åºã¥ããŠãdocãã£ãŒã«ãïŒããã³ãã®ãã¹ãŠã®ãµãããã¥ã¡ã³ãïŒãžã®ã¢ã¯ã»ã¹æš©ã決å®ã§ããŸããããã®é åã«åºã¥ããŠdoc.field1ããã³doc.fieldãã£ãŒã«ãã«ç°ãªãæš©éãé©çšããããšã¯ã§ããŸããã ãããè¡ãã«ã¯ãMongoDbæäœãå«ããªããžã§ã¯ããæž¡ããã修食åãã©ã¡ãŒã¿ãŒã䜿çšã§ããŸããæäœã®å®å šãªåæãè¡ããªãããã«ãäœããã®ããŒããã©ãŒãããã®ã¿ãèš±å¯ããä»ã®ãã¹ãŠã®ãªãã·ã§ã³ãäœããã®æ¹æ³ã§çŠæ¢ããŸãã
Test.allow({ update: function (userId, user, fields, modifier) { console.log('Test.allow(): userId:', userId, '; document:', document, '; fields:', fields, '; modifier:' , modifier); var setData = modifier["$set"]; return setData && Object.keys(setData).length===1 && setData["doc.field1"]; } });
ãã¡ããã èš±å¯ / æåŠã«ãŒã«ã¯ãå®å šã§ãªãããã±ãŒãžããããžã§ã¯ãããåé€ãããå Žåã«ã®ã¿æ©èœããŸãã ãšããã§ããããã®ãã³ãã©ãŒã¯ãã¯ã©ã€ã¢ã³ãã«ãããµãŒããŒåŽã®å€æŽã«ã䜿çšã§ããŸãã
ä¿¡é Œã§ããã³ãŒããšä¿¡é Œã§ããªãã³ãŒã
ãããŸã§ãèå¥åã«ãã£ãŠã¬ã³ãŒããå€æŽããŸããã å®éã«ã¯ãã¯ã©ã€ã¢ã³ãã¯æŽæ°æäœãå®è¡ã§ãããèŠæ±ã»ã¬ã¯ã¿ãŒã§äœãä»ã®ãã®ã瀺ããŸããããšãã°ã
Test.update({ value: 1 }, { $set: { "doc.field1": "value1" } } ) Error: Not permitted. Untrusted code may only update documents by ID. [403]
ããã¯ãMeteorãä¿¡é Œã§ããã³ãŒããšä¿¡é Œã§ããªãã³ãŒããåé¢ããŠãããšããäºå®ã«ãããã®ã§ãã ã¯ã©ã€ã¢ã³ãã§åŒã³åºããããµãŒããŒã¡ãœãããå«ããµãŒããŒã§å®è¡ãããã³ãŒãã¯ãä¿¡é Œã§ãããšèŠãªãããŸãã ä¿¡é Œã§ããªã-ãã©ãŠã¶ã®ã¯ã©ã€ã¢ã³ãåŽã§å®è¡ãããã³ãŒãã
ä¿¡é ŒãããŠããªãã³ãŒãã¯ãããã¥ã¡ã³ãã®_idã瀺ããèš±å¯/æåŠã«ãŒã«ã確èªããŠãããã¥ã¡ã³ããäžåºŠã«1ã€ã ãå€æŽã§ããŸãã ãŸããã¢ãããµãŒãæäœïŒããã¥ã¡ã³ãããªãå Žåã¯æ¿å ¥ïŒãèš±å¯ãããŸããã åãæ¹æ³ã§ã®åé€æäœã¯ã_idãæå®ãããåäžã®ããã¥ã¡ã³ãã«ã®ã¿é©çšã§ããŸãã 詳现ã«ã€ããŠã¯ã docs.meteor.com / ïŒ updateããã³docs.meteor.com/#removeã®ããã¥ã¡ã³ããåç §ããŠãã ãã ã
ãµãŒããŒã¡ãœãã
ã¯ã©ã€ã¢ã³ããããŒã¿ããŒã¹ã«çŽæ¥ã¢ã¯ã»ã¹ãã代ããã«ããµãŒããŒåŽã®æ¹æ³ã䜿çšã§ããŸãã ãµãŒããŒã§å®è¡ãããã³ãŒãã¯ä¿¡é Œã§ãããšèŠãªããããããéèŠãªæäœã®ããžãã¯ããµãŒããŒã«é 眮ããŠãã¯ã©ã€ã¢ã³ãäžã®å¯Ÿå¿ããã³ã¬ã¯ã·ã§ã³ãžã®å€æŽãçŠæ¢ããããšãã§ããŸãã ããšãã°ããµãŒããŒã«è¿œå ããŸãã
Meteor.startup(function() { Meteor.methods({ testMethod: function(data) { console.log('testMethod(): data:', data); return 'testMethod finished (data:',data,')'; } }); });
ãããŠãã¡ãœãããå®äºãããšãã«åŒã³åºãããæåŸã®ãã©ã¡ãŒã¿ãŒã³ãŒã«ããã¯ãæž¡ããŠãã¯ã©ã€ã¢ã³ãåŽããåŒã³åºããŸãã
> Meteor.call('testMethod', 'test data', function(err, result) {console.log(err, result);}) undefined undefined "testMethod finished (data:test data)"
HTTPSããã³force-sslããã±ãŒãž
Meteorèªäœã«ã¯HTTPSãµããŒããå«ãŸããŠãããã蚌ææžããã¹ãããSSLãçµäºããäžéãµãŒããŒãå¿ èŠã§ãã çµã¿èŸŒã¿ã®force-sslããã±ãŒãžã䜿çšãããšãlocalhostããã®æ¥ç¶ãé€ããHTTPæ¥ç¶ãHTTPS URLã«ãªãã€ã¬ã¯ãã§ããŸãã
Nginxã䜿çšããå Žåããªãã€ã¬ã¯ãã¯æ¬¡ã®ããã«å®è£ ã§ããããããã®ããã±ãŒãžã¯å¿ èŠãããŸããã
ïŒlocalhostäžã®NginxãMeteorã®ãããã·ãšããŠèšå®ããäŸïŒèªå·±çœ²å蚌ææžã®çæãå«ãïŒïŒ
蚌ææžãšããŒã/ etc / nginx / sslãã©ã«ããŒã«ã³ããŒããŸã
ãã¡ã€ã«/etc/nginx/sites-available/meteor.confãäœæããŸãïŒNginxãããŒããããã€ã³ã¹ããŒã«ããå ŽåãåãããŒããç»é²ãããŠããåããã£ã¬ã¯ããªã«ããããã©ã«ããã¡ã€ã«ãåé€ãŸãã¯åæ§æããå¿ èŠããããŸãïŒã
ãªã³ã¯ãäœæïŒ
Nginxãåèµ·åããŸãã
ããŒãšèšŒææžãçæãã
$ openssl genrsa -des3 -out localhost.key 1024 $ openssl req -new -key localhost.key -out localhost.csr Common Name (eg, YOUR name) :localhost $ openssl x509 -req -days 1024 -in localhost.csr -signkey localhost.key -out localhost.crt
蚌ææžãšããŒã/ etc / nginx / sslãã©ã«ããŒã«ã³ããŒããŸã
$ mkdir /etc/nginx/ssl $ cp ./localhost.key /etc/nginx/ssl $ cp ./localhost.crt /etc/nginx/ssl
Nginxèšå®
ãã¡ã€ã«/etc/nginx/sites-available/meteor.confãäœæããŸãïŒNginxãããŒããããã€ã³ã¹ããŒã«ããå ŽåãåãããŒããç»é²ãããŠããåããã£ã¬ã¯ããªã«ããããã©ã«ããã¡ã€ã«ãåé€ãŸãã¯åæ§æããå¿ èŠããããŸãïŒã
server { listen 80; server_name localhost; # $scheme will get the http protocol # and 301 is best practice for tablet, phone, desktop and seo # return 301 $scheme://example.com$request_uri; # We want to redirect people to the https site when they come to the http site. return 301 https://localhost$request_uri; } server { listen 443; server_name localhost; client_max_body_size 500M; access_log /var/log/nginx/meteorapp.access.log; error_log /var/log/nginx/meteorapp.error.log; location / { proxy_pass http://localhost:3000; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } ssl on; ssl_certificate /etc/nginx/ssl/localhost.crt; ssl_certificate_key /etc/nginx/ssl/localhost.key; ssl_verify_depth 3; }
ãªã³ã¯ãäœæïŒ
ln -s /etc/nginx/sites-available/meteor.conf /etc/nginx/sites-enabled/meteor.conf
Nginxãåèµ·åããŸãã
$ sudo service nginx restart
ãã©ãŠã¶ããªã·ãŒãã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒãããã³X-Frame-Optionsããã±ãŒãž
å®éããã®ä»ã®2ã€ã®ããã±ãŒãžã¯browser-policyã®èåŸã«é ãããŠããããããããbrowser-policy-contentãšbrowser-policy-framingã®å¥ã ã«äœ¿çšã§ããŸãã ãããã®æåã®ãã®ã¯ãããŸããŸãªã¿ã€ãã®ãªãœãŒã¹ãããŒãããããã®ãœãŒã¹ã®ãã¯ã€ããªã¹ããæå®ãããã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒã«ãŒã«ãå®çŸ©ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã 2ã€ç®ã¯X-Frame-Originãã©ã¡ãŒã¿ãŒã§ããããå®è¡ããããšããŠãããµã€ãã®URIã«å¿ããŠããã¬ãŒã ãŸãã¯iframeã¿ã°å ã«ããŒãžã衚瀺ã§ããŸãïŒçŸæç¹ã§ã¯ãX-Frame-Originã§ãœãŒã¹URIãæå®ããããšã¯Firefoxããã³IE 8以éã§ã®ã¿ãµããŒããããŠããŸãïŒã
ããã±ãŒãžã®è¿œå ã«ã¯ããã©ã«ãã®ããªã·ãŒãå«ãŸããŸãããã³ã³ãã³ãã®ããŠã³ããŒãã¯ããŒãžèªäœãšåããµã€ãããã®ã¿èš±å¯ãããŸãããXMLHTTPRequestãªã¯ãšã¹ããšWebSocketæ¥ç¶ã¯ã©ã®ãµã€ãã«ãéä¿¡ã§ããŸãã ããã«ãevalïŒïŒãªã©ã®æ©èœã¯ãããã¯ãããã¢ããªã±ãŒã·ã§ã³ã¯ãããŠã³ããŒãå ãšåããµã€ãã§ã®ã¿ãã¬ãŒã ããã³iframeã«å«ããããšãã§ããŸãã
åæã«ãããŒãžãèªã¿èŸŒãŸãããšããµãŒããŒã®å¿çããããŒã«æ¬¡ã®ãã©ã¡ãŒã¿ãŒãè¿œå ãããŸãã
content-security-policy: default-src 'self'; script-src 'self' 'unsafe-inline'; connect-src * 'self'; img-src data: 'self'; style-src 'self' 'unsafe-inline'; x-frame-options: SAMEORIGIN
ãŸãããã®äŸã§ã¯ãå€éšãµã€ãïŒGoogleããã³FacebookïŒããã®ãŠãŒã¶ãŒç»åã¯ãã³ã³ãœãŒã«ã«æ¬¡ã®ã¡ãã»ãŒãžãšãšãã«è¡šç€ºãããªããªããŸãã
Refused to load the image 'https://lh6.googleusercontent.com/-aCxpjiDMNcM/AAAAAAAAAAI/AAAAAAAAJMY/9hZytqLLZ6Q/photo.jpg' because it violates the following Content Security Policy directive: "img-src data: 'self'".
å€éšãµã€ãããã®ç»åãåã³è¡šç€ºãããããã«ããã«ã¯ããµãŒããŒã«æ¬¡ã®è¡ãè¿œå ããŸãã
Meteor.startup(function() { BrowserPolicy.content.allowImageOrigin("https://*.googleusercontent.com"); BrowserPolicy.content.allowImageOrigin("http://profile.ak.fbcdn.net"); BrowserPolicy.content.allowImageOrigin("http://graph.facebook.com"); });
ã¿ã€ãã«ã¯æ¬¡ã®ããã«ãªããŸãã
content-security-policy: default-src 'self'; script-src 'self' 'unsafe-inline'; connect-src * 'self'; img-src data: 'self' https://*.googleusercontent.com http://profile.ak.fbcdn.net http://graph.facebook.com; style-src 'self' 'unsafe-inline'; x-frame-options: SAMEORIGIN
ããã©ã«ãã®å¶éã«å ããŠãMeteorã®ããã¥ã¡ã³ãã§ã¯ããµãŒããŒåŽã§BrowserPolicy.content.disallowInlineScriptsïŒïŒãåŒã³åºããŠãããŒãžã§ã€ã³ã©ã€ã³Javascriptãå®è¡ã§ããªãããã«ããããšãæšå¥šããŠããŸãïŒãã¡ãããã€ã³ã©ã€ã³Javascriptã䜿çšããªãå ŽåïŒã
ããŒã¿æ€èšŒïŒ checkïŒïŒé¢æ°ãšaudit-arguments-checkããã±ãŒãž
Meteorã¯ããµãŒããŒã¡ãœãããšãããªãã·ã¥é¢æ°ã«æž¡ãããããŒã¿ãæ€èšŒããã¡ã«ããºã ãæäŸããŸãã ãããè¡ãããã«ã checkïŒïŒé¢æ°ãæå³ãããŠããããã§ãã¯ãããå€ãšæ€èšŒçšã®ãã³ãã¬ãŒããæž¡ãããŸãã ãã³ãã¬ãŒãã¯ãæ瀺çãªåæ瀺ããŸãã¯ããè€éãªæ€èšŒã«ãŒã«ãå®çŸ©ããMatchãªããžã§ã¯ãã«ããããšãã§ããŸãïŒhttpïŒ//docs.meteor.com/#matchãåç §ïŒ
audit-argument-checksããã±ãŒãžãã€ã³ã¹ããŒã«ãããšãæ€èšŒã«åæ Œããªãã£ãããŒã¿ã«åæ Œããå ¬éã¡ãœããããã³å ¬éé¢æ°ã®å®è¡ããããã¯ãããŸãã
æ€èšŒãäžèŠãªå Žåã¯ã次ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠãã§ãã¯æ©èœãåŒã³åºãããšãã§ããŸã
check(arguments, [Match.Any])
ããã±ãŒãžãè¿œå
$ mrt add audit-argument-checks
ãµãŒããŒã¡ãœãããåŒã³åºãããšãããšããšã©ãŒãè¿ãããŸãã
> Meteor.call('testMethod', 'test data', function(err, result) {console.log(err, result);}) undefined errorClass {error: 500, reason: "Internal server error", details: undefined, message: "Internal server error [500]", errorType:"Meteor.Error"âŠ} undefined
ãµãŒããŒäžïŒ
Exception while invoking method 'testMethod' Error: Did not check() all arguments during call to 'testMethod'
ãµãŒããŒã¡ãœããã«æ€èšŒãè¿œå ãããšãåã³æ£ããæ©èœãå§ããŸãã
check(data, String);
çµè«ã®ä»£ããã«
éçºãå ±æããããšããŠããæ¬è³ªçã«Meteorã®éåžžã«å°ããªéšåã«ãã圱é¿ãåãŒããªããšããäºå®ã«ãããããããçŽ æã®ããªã¥ãŒã ãã©ãã»ã©å€§ãããªããã«æ°ä»ããŸããã§ããã
ãã®ããã¹ãããMeteorããã詳ããç¥ããããã«ã€ããŠæ°ããããšãåŠã¶ã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã