Jump to content

DeX

Members
  • Posts

    256
  • Joined

  • Last visited

Posts posted by DeX

  1. Sorry, I should have included that. We will be running reports based on which quotes have certain criteria:

    - how many are over a certain length

    - how many have item X selected

    - how many of item X we sold

    These are all based on user entered inputs and wrapped up in the JSON. The reports are generated whenever anyone loads the reports page to view them, they're not done on a schedule like nightly.

  2. The inputs are related to quotes being sent to customers so often times a customer will want to modify their quote, in which case the user will open an old one, load all of the input values from the database and change some, only to re-save it with the new inputs. The re-save does not modify the old table row, it simply creates a new row under the same account.

  3. I have a system where users enter about 100 inputs, not all are required. We capture every input when the user clicks save and they have the ability to look back at any save they have and edit the inputs to re-save.

    Currently we serialize the inputs, wrap it up in a JSON string and save it into a column in the MySQL table. I'm wondering if there would be a speed / storage advantage to specifying a column for each input and storing each value in its own column.

    If  you're wondering how often the inputs change, it's infrequent. We might add / remove / modify about 20 inputs a year, probably fewer. If you're wondering how often saves are done, it's about 8 users doing 40 saves each, per day.

  4. Every item has a corresponding quantity calculation that's input manually by the developer, this calculation never changes. Then when a final price for the building is needed, it does the following:

    - get all product ID from the database

    - loop through all product ID quantity calculations and multiply this quantity by the price in the database (price updated once a month)

    - adding all these totals together and multiplying by a markup percentage gives us our final price

    Is that all  you needed?

  5. I have a Bill Of Materials (BOM) and we buy a building product from a third party supplier that custom makes them for us. They charge us a certain price based on these factors of the product:

    - width of building (in static increments: 24, 30, 36, 42, 44, 50...)

    - building type it's being used in (each type requires certain design specifications to meet code requirements)

    - snow load (depending on where in the country the building will be, we need to make it more durable if there will be a higher snow load on the building)

    Based on all of these, they build the product for us and charge us accordingly. I'm wondering if I need to have 400 items in my BOM to account for each combination of length, building type and snow load for this one product. Is this normal practice? The price differences don't have a pattern and don't overlap in any way, it's random pricing set for each combination. It's not like the price goes up $30 for each length, the pricing gaps are all different for each setting.

  6. I just set up my first mail server ever using Postfix and when I run 

    echo testing | mail -s subjecttttt da***@*********.com
    
    

    it sends fine and I receive the email at that address. The problem is when I create a php page on the server and write 

    mail("da***@*****.com", "test", "test");
    

    then run the page in my browser, it doesn't send the email.

    From what I read online, it's because the root user on the command line has permissions to send mail while the www-data user in the browser does not. Is there a way I can specify which user Postfix uses? Any other suggestions? Thanks a lot.

  7. More discoveries. I remembered I still have the old virtual machine we were previously using as our web server, I have since replaced that with a new virtual machine on the same VMWare server. Both virtual servers are almost identical, the only difference is the new one has more disk space. I spooled up the old server, copied the test script to it and it runs flawlessly every time. I'm also able to ping out of that server no problem so it's some setting in the new server which is preventing me from making outbound requests. I'm going to continue my search there and not mess with any firewall settings.

  8. I was referring to outbound, specifically the responses. Say you ping 8.8.8.8, it sounds to me like what is happening is roughly:

    • Outbound ICMP packet goes to 8.8.8.8 via ISP #2 (1.2.3.4)
    • 8.8.8.8 replies to 1.2.3.4
    • Your router receives an ICMP reply to 1.2.3.4
    • Router doesn't know what to do with destination 1.2.3.4, so it drops the packet.
    I've had issues like this with IPv6 traffic before and my home ISP. One way to check for such a problem is to ping an external machine you control and watch it's traffic via something like TCP dump.

     

    When I was diagnosing my IPv6 problem I had 3 points I could monitor. 1) My desktop, 2) My home router, and 3) My external VPS. I'd send a ping from my desktop to my VPS and use tcpdump on both the router and vps to watch the packet go out. VPS would reply, my router would see the reply, but it never made it to my desktop.

     

     

    I get it, so I need to forward ports 80 and 443 from the ISP 2 static IP as well. Is that what you're saying? I thought a ping would always come through but I guess that makes sense.

     

    Something else I'm exploring is the fact that I can't really ping anything from this server which leads me to think it's something with the DNS or gateway not being set properly. That way inbound traffic works fine but outbound not so much. I'm just trying to figure out what I would set the gateway, DNS and subnet mask to right now to see if that's the issue. I'm not sure if it's the settings I got from my ISP or if it's an internal default for the firewall.

  9. Sounds like a routing problem of some kind. I've not messed with anything on this level so I can't speak to how things should be configured.

     

    What IP's does the server have available if you run ifconfig?

     

    I imagine two possible ways one might configure load balancing.

    One would be at the router level. That means your server should be setup similar to any other PC in your network, with an internal network IP rather than a public IP from your ISP. The router could direct new connections to which ever ISP has the most available bandwidth.

     

    The other at the server level. You would configure the server with a static IP for each ISP then make sure your router knows to route those IP's to that server. The OS (or individual applications) could then control which ISP handles the traffic by choosing which IP to use as the originating IP.

     

     

    It sounds like at the moment the router only knows what to do with ISP #1's address. Traffic it receives for ISP #2's address gets dropped/rejected because the router doesn't know about it.

     

    It sounds like you're referring to incoming connections, is that right? Everything incoming is perfect because the domain points to the ISP 1 static IP and the router (in the firewall) forwards all port 443 andn 80 requests to that specific server internally. Perfect.

     

    The issue is with the outbound requests, I can't ping anything from this server and can only succeed on the Google API requests if the packet goes out through X1 on the firewall (ISP 1). I have the load balancing set to Round Robin which means packets get sent out randomly through whichever ISP line it happens to pick up and it seems to affect whether or not these API requests succeed for some reason. I don't know why.

     

    I feel like setting up a whole new Ubuntu server to see if that can ping.

     

    Very important, I just discovered something else. I copied the script to a separate EC2 server I have with Amazon which is completely unrelated to our network here at the office and the script works 100% of the time on that server. It works perfectly, I just need to figure out why it is not working from my office server.

  10. New discoveries. The /etc/network/interfaces file is unmodified which makes me think I never set any sort of static IP for this server, I just set port forwarding for port 80 on the firewall to go to this machine. It is in the DMZ which led me to believe it may not have permissions to access the WAN but I ran the same ping test (ping google.ca) on a Windows machine on the DMZ and it returned all packets without problem. When I run the ping test on the web server (the one in question), it loses all packets. I can't ping anything from the web server.

     

    This is weird. And just to clarify, this is our production web server, it's working inside and outside the network perfectly otherwise.

  11. If all the requests are to the same IP or IP range, I'd try adjusting the routing tables first (add a static route to the target). Of course, that might not work, because the problem itself is that your IP is dynamic, right?

     

    Of course, what about the real error, that it can't resolve the hostname? What DNS server are you using? Is it accessible from the machine in question when it's connected to ISP2? I'm guessing no ...

     

    In that case, I'd select a DNS source that's accessible from anywhere (like Google's public DNS) or run a local caching DNS box behind the firewall.

     

    What's your OS? Is "/etc/resolv.conf" a thing on your server? If so, what does it contain?

     

    And let's get even MORE basic ... if the server is on ISP2 ... can it connect to ANYTHING at all? For example, by IP address ... "ping 8.8.8.8" ...

     

    Our IP is static, we have a static IP from ISP 1 and a different static IP from ISP 2. I only have the static IP from ISP 1 set on the server and also the ISP 1 specific nameservers as well.

     

    The script connects 100% of the time when only on ISP 1 and 0% of the time when only on ISP 2.

     

    Can I change the DNS and still get access to the internet? I thought I had to use the DNS provided by my ISP.

     

    The server is running Ubuntu 16.04 and /etc/resolv.conf contains the following with numbers instead of *:

    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    nameserver 64.*.135.*
    nameserver 207.*.226.*
    nameserver 64.*.128.*
    
    

    I'll have to run this last test for you outside work hours to test.

  12. We currently have 2 separate ISP providing us internet at our office and I set up our firewall to load balance the traffic on both networks. We have a production server behind the firewall and it's set to a static IP given to us by ISP 1.

     

    I set up a PHP script on the server to connect to our Google Drive through their API and it works great 50% of the time. The other 50% it times out so I tried taking ISP 2 out of the load balancer and having the company run completely on ISP 1, this caused the script to work 100% of the time and complete in under 1 second. When I remove ISP 1 and have the company running on just ISP 2, the script fails 100% of the time with the same timeout, saying it couldn't resolve the hostname of the Google Drive server.

     

    While running on either network, our internet works just fine, no problems at all. I run speed tests and they're perfect, we're supposed to get 10 down from one ISP and 20 down from the other but the tests show around 28 down at each terminal.

     

    How do I set the server to always make its outbound API requests on ISP 1? Can I add a second static IP for ISP 2 and will that work? I don't know what to do next, thanks.

     

    API error:

     

     

     RuntimeException: Error creating resource: [message] fopen(https://www.googleapis.com/oauth2/v4/token): failed to open stream: Connection timed out [file] /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php [line] 324 in /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php:252 Stack trace: #0 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php(335): GuzzleHttp\Handler\StreamHandler->createResource(Object(Closure)) #1 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php(52): GuzzleHttp\Handler\StreamHandler->createStream(Object(GuzzleHttp\Psr7\Request), Array) #2 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php(66): GuzzleHttp\Handler\StreamHandler->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #3 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Middleware.php(30): GuzzleHttp\PrepareBodyMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #4 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php(70): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array) #5 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Middleware.php(59): GuzzleHttp\RedirectMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #6 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/HandlerStack.php(67): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array) #7 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(277): GuzzleHttp\HandlerStack->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #8 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(99): GuzzleHttp\Client->transfer(Object(GuzzleHttp\Psr7\Request), Array) #9 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(106): GuzzleHttp\Client->sendAsync(Object(GuzzleHttp\Psr7\Request), Array) #10 /var/www/versions/development/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php(34): GuzzleHttp\Client->send(Object(GuzzleHttp\Psr7\Request), Array) #11 /var/www/versions/development/vendor/google/auth/src/OAuth2.php(501): Google\Auth\HttpHandler\Guzzle6HttpHandler->__invoke(Object(GuzzleHttp\Psr7\Request)) #12 /var/www/versions/development/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php(115): Google\Auth\OAuth2->fetchAuthToken(Object(Google\Auth\HttpHandler\Guzzle6HttpHandler)) #13 /var/www/versions/development/vendor/google/auth/src/FetchAuthTokenCache.php(84): Google\Auth\Credentials\ServiceAccountCredentials->fetchAuthToken(Object(Google\Auth\HttpHandler\Guzzle6HttpHandler)) #14 /var/www/versions/development/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php(115): Google\Auth\FetchAuthTokenCache->fetchAuthToken(Object(Google\Auth\HttpHandler\Guzzle6HttpHandler)) #15 /var/www/versions/development/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php(102): Google\Auth\Middleware\AuthTokenMiddleware->fetchToken() #16 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php(37): Google\Auth\Middleware\AuthTokenMiddleware->Google\Auth\Middleware\{closure}(Object(GuzzleHttp\Psr7\Request), Array) #17 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Middleware.php(30): GuzzleHttp\PrepareBodyMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #18 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php(70): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array) #19 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Middleware.php(57): GuzzleHttp\RedirectMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #20 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/HandlerStack.php(67): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array) #21 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(277): GuzzleHttp\HandlerStack->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #22 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(99): GuzzleHttp\Client->transfer(Object(GuzzleHttp\Psr7\Request), Array) #23 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(106): GuzzleHttp\Client->sendAsync(Object(GuzzleHttp\Psr7\Request), Array) #24 /var/www/versions/development/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php(34): GuzzleHttp\Client->send(Object(GuzzleHttp\Psr7\Request), Array) #25 /var/www/versions/development/vendor/google/apiclient/src/Google/Http/REST.php(74): Google\Auth\HttpHandler\Guzzle6HttpHandler->__invoke(Object(GuzzleHttp\Psr7\Request)) #26 /var/www/versions/development/vendor/google/apiclient/src/Google/Task/Runner.php(176): Google_Http_REST::doExecute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), 'Google_Service_...') #27 /var/www/versions/development/vendor/google/apiclient/src/Google/Http/REST.php(58): Google_Task_Runner->run() #28 /var/www/versions/development/vendor/google/apiclient/src/Google/Client.php(788): Google_Http_REST::execute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), 'Google_Service_...', Array) #29 /var/www/versions/development/vendor/google/apiclient/src/Google/Service/Resource.php(232): Google_Client->execute(Object(GuzzleHttp\Psr7\Request), 'Google_Service_...') #30 /var/www/versions/development/vendor/google/apiclient-services/src/Google/Service/Drive/Resource/Files.php(206): Google_Service_Resource->call('list', Array, 'Google_Service_...') #31 /var/www/versions/development/drive-test.php(74): Google_Service_Drive_Resource_Files->listFiles(Array) #32 {main} Next GuzzleHttp\Exception\RequestException: Error creating resource: [message] fopen(https://www.googleapis.com/oauth2/v4/token): failed to open stream: Connection timed out [file] /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php [line] 324 in /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php:52 Stack trace: #0 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php(67): GuzzleHttp\Exception\RequestException::wrapException(Object(GuzzleHttp\Psr7\Request), Object(RuntimeException)) #1 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php(66): GuzzleHttp\Handler\StreamHandler->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #2 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Middleware.php(30): GuzzleHttp\PrepareBodyMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #3 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php(70): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array) #4 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Middleware.php(59): GuzzleHttp\RedirectMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #5 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/HandlerStack.php(67): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array) #6 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(277): GuzzleHttp\HandlerStack->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #7 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(99): GuzzleHttp\Client->transfer(Object(GuzzleHttp\Psr7\Request), Array) #8 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(106): GuzzleHttp\Client->sendAsync(Object(GuzzleHttp\Psr7\Request), Array) #9 /var/www/versions/development/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php(34): GuzzleHttp\Client->send(Object(GuzzleHttp\Psr7\Request), Array) #10 /var/www/versions/development/vendor/google/auth/src/OAuth2.php(501): Google\Auth\HttpHandler\Guzzle6HttpHandler->__invoke(Object(GuzzleHttp\Psr7\Request)) #11 /var/www/versions/development/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php(115): Google\Auth\OAuth2->fetchAuthToken(Object(Google\Auth\HttpHandler\Guzzle6HttpHandler)) #12 /var/www/versions/development/vendor/google/auth/src/FetchAuthTokenCache.php(84): Google\Auth\Credentials\ServiceAccountCredentials->fetchAuthToken(Object(Google\Auth\HttpHandler\Guzzle6HttpHandler)) #13 /var/www/versions/development/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php(115): Google\Auth\FetchAuthTokenCache->fetchAuthToken(Object(Google\Auth\HttpHandler\Guzzle6HttpHandler)) #14 /var/www/versions/development/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php(102): Google\Auth\Middleware\AuthTokenMiddleware->fetchToken() #15 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php(37): Google\Auth\Middleware\AuthTokenMiddleware->Google\Auth\Middleware\{closure}(Object(GuzzleHttp\Psr7\Request), Array) #16 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Middleware.php(30): GuzzleHttp\PrepareBodyMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #17 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php(70): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array) #18 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Middleware.php(57): GuzzleHttp\RedirectMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #19 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/HandlerStack.php(67): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array) #20 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(277): GuzzleHttp\HandlerStack->__invoke(Object(GuzzleHttp\Psr7\Request), Array) #21 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(99): GuzzleHttp\Client->transfer(Object(GuzzleHttp\Psr7\Request), Array) #22 /var/www/versions/development/vendor/guzzlehttp/guzzle/src/Client.php(106): GuzzleHttp\Client->sendAsync(Object(GuzzleHttp\Psr7\Request), Array) #23 /var/www/versions/development/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php(34): GuzzleHttp\Client->send(Object(GuzzleHttp\Psr7\Request), Array) #24 /var/www/versions/development/vendor/google/apiclient/src/Google/Http/REST.php(74): Google\Auth\HttpHandler\Guzzle6HttpHandler->__invoke(Object(GuzzleHttp\Psr7\Request)) #25 /var/www/versions/development/vendor/google/apiclient/src/Google/Task/Runner.php(176): Google_Http_REST::doExecute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), 'Google_Service_...') #26 /var/www/versions/development/vendor/google/apiclient/src/Google/Http/REST.php(58): Google_Task_Runner->run() #27 /var/www/versions/development/vendor/google/apiclient/src/Google/Client.php(788): Google_Http_REST::execute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), 'Google_Service_...', Array) #28 /var/www/versions/development/vendor/google/apiclient/src/Google/Service/Resource.php(232): Google_Client->execute(Object(GuzzleHttp\Psr7\Request), 'Google_Service_...') #29 /var/www/versions/development/vendor/google/apiclient-services/src/Google/Service/Drive/Resource/Files.php(206): Google_Service_Resource->call('list', Array, 'Google_Service_...') #30 /var/www/versions/development/drive-test.php(74): Google_Service_Drive_Resource_Files->listFiles(Array) #31 {main}

     

  13. I got it, though it's incredibly slow and sometimes times out. I'll leave it here because I know others will be looking for this in the future.

     

    0. Install the Google API using Composer, this is quite easy with some online tutorials.

    1. Create a service account inside the Google Administrator interface. There are lots of other resources on this and it's easy.

    2. Go to admin.google.com where you manage API client access. Enter your service account client ID in the first box and then "https://www.googleapis.com/auth/drive" into the second box. This is for full Drive access, you can also restrict the type by using something else.

    3. Then you run your code, this is what I used:

    <?php
        include_once __DIR__ . '/vendor/autoload.php';
    
        // location of credentials file downloaded from Google Drive
        $credentialsFile = '/var/client-service.json'; // you manually copy this file to your server
    
        // fail if our configuration file does not exist
        if (!file_exists($credentialsFile)) {
            throw new RuntimeException('Service account credentials Not Found!');
        }
    
        putenv('GOOGLE_APPLICATION_CREDENTIALS=' . $credentialsFile);
        $client = new Google_Client();
        $client->useApplicationDefaultCredentials();
        // add full Drive scope, other options can be read only or metadata
        $client->addScope('https://www.googleapis.com/auth/drive'); // full Drive access
    
        $client->setAccessType('offline');
        // select user you want to impersonate
        $client->setSubject('your_user@email.com');
        $httpClient = $client->authorize();
        $service = new Google_Service_Drive($client);
        // specify parameters we want to work with, including folder name
    // xxxxxxxxxxxxxxxxxx is the folder ID you want to read from
    // get the folder ID from logging into that user's Google Drive
        $optParams = array(
            'pageSize' => 10,
            'fields' => "nextPageToken, files(contentHints/thumbnail,fileExtension,iconLink,id,name,size,thumbnailLink,webContentLink,webViewLink,mimeType,parents)",
            'q' => "'xxxxxxxxxxxxxxxxxx' in parents"
        );
    
        // list the files in the specified folder
        $files = $service->files->listFiles($optParams);
    
        // for testing, print file data so we can see it works
        foreach ($files as $file)
            print_r($file);
    
        // if desired, create a folder in this user's Drive
        $fileMetadata = new Google_Service_Drive_DriveFile(array('name' => 'Invoices3','mimeType' => 'application/vnd.google-apps.folder', 'folderId' => 'xxxxxxxxxxxxxxxxxx'));
        $newFile = $service->files->create($fileMetadata, array('fields' => 'id'));
    
    ?>
    

    You have to create that service account and I believe I also created a project to link it to, these steps are in just about every tutorial I followed, what I could not find previously was how to impersonate the user so you weren't just interacting with the service account's Drive and this code shows how to do that. After creating your service account, it forces you to download the JSON file and this is the client-service.json file you will need to copy to your server at the location you specify near the top. Good luck, it's working for me.

  14. I assume it's similar to this: https://stackoverflow.com/questions/12710262/google-drive-redirect-uri-mismatch

     

    Except you probably will need to select a different application type and set the redirect URI appropriately.

     

    Close, but that's for creating a client ID for an Installed Application, I've already gotten it working that way but the access token keeps expiring and the user needs to log in every time. I'm trying to create a service account which has the benefit of automatic login without user interaction. With the service account specifically there is no place to add acceptable redirect URI.

  15. Slight problem. I created the service account, downloaded the JSON key file and pointed my application to it. Now when I try to open my web application, I get the error "Error: redirect_uri_mismatch." This is quite a common error on user accounts where you have not set your redirect URI in the permissions for that client ID account and you can easily fix it by adding the redirect URI, however, for a service account I cannot figure out anywhere to add redirect URI. Where to I add them? Should I even be getting this error on a service account?

  16. I already have the script working to access my Google Drive contents but at the beginning of the session the user must enter the Drive password, then the web application I built will work fine until that Drive access token expires (3600 seconds). Then you can either enter the password again or set up a refresh token to renew but I'm trying to avoid this initial manual login.

     

    We use Google Drive for document management here in the office and all of our job files are stored there so anyone in the company with access can go in and look at any files related to a specific job in their Google Drive (via Shared With Me link). I'm building an area in our internal job management web application that will allow people to view these files in our portal and also upload new files through the portal that go into Google Drive into that job file's folder. 

     

    These users using this portal have no idea what the login is for the main Drive administrator but this account will be used to access the files. Therefore when it prompts them for the password in my web application, they won't know it. I want it to just allow them access seamlessly, is this possible? I'm only granting them view and upload permissions and it's a small group of people I trust with those permissions.

     

    The reason for the web application is because I built something that runs all of our job estimation and stores all of our quotes, customer profiles and purchase orders associated with each job. Everything is automatically generated with an estimated price so I would like to have another tab which shows all associated files to that job which have been uploaded to the main Google Drive account so everything is together in one place.

     

    Does Google and OAuth2 even allow this?

  17. Currently I have a portal which requires a salesman login in order to create or view customer quotes. When the salesman emails a quote to a customer, it simply emails out a link with a token attached to it and when the customer clicks the link to view their quote, the system will provide it if the correct token is supplied. This allows customers whom are not logged in to view a quote behind the login.

     

    What I would like to do is to give customers the ability to have their own login created automatically when a new quote is generated for them and they can just log in under their account to view all of their quotes they have for them. I'm wondering which way I should do this, since the users and customers are in 2 separate tables in the database.

     

    1. When creating a quote which creates a customer, also create them a record in the users database so they can log into the system (with restricted access).

    2. Instead of creating a record in the customers table, just create them a record in the users table and start using that to fetch customer information from instead.

    3. Also allow login access for any record in the customers table and add a password field to that table.

     

    Which is best?

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.