<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mike Hingley</title>
    <description>The latest articles on DEV Community by Mike Hingley (@computamike).</description>
    <link>https://dev.to/computamike</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F98637%2F19aaa19b-081f-4563-92e4-a24c8e61b9b6.jpeg</url>
      <title>DEV Community: Mike Hingley</title>
      <link>https://dev.to/computamike</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/computamike"/>
    <language>en</language>
    <item>
      <title>Looking at the REST api for YouDontNeedACRM</title>
      <dc:creator>Mike Hingley</dc:creator>
      <pubDate>Tue, 09 Nov 2021 00:09:26 +0000</pubDate>
      <link>https://dev.to/computamike/looking-at-the-rest-api-for-youdontneedacrm-2icp</link>
      <guid>https://dev.to/computamike/looking-at-the-rest-api-for-youdontneedacrm-2icp</guid>
      <description>&lt;p&gt;I started looking at the REST API for &lt;a href="https://youdontneedacrm.com/"&gt;youdontneedacrm&lt;/a&gt; - and I thought I'd share my experiences here in a blog post on DEV.&lt;/p&gt;

&lt;p&gt;To start with you can get a 15 day free licence to use site (and the API) - so I started filling the code to create the account : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IFtBWKkq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mdba966chgkppw8lyqtx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IFtBWKkq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mdba966chgkppw8lyqtx.png" alt="Alt Text" width="880" height="750"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now there is a part of the sign up that I found confusing - and it was around the type of account you want to set up - I don't have any screenshots of this section.  &lt;/p&gt;

&lt;p&gt;Once you have chose the account type that you would like to make, then eventually - you need to activate your account&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bG6cxV-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9270sp6r64ux69pnb27l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bG6cxV-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9270sp6r64ux69pnb27l.png" alt="Alt Text" width="880" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;one of the options to enable the account is to spread the word - hence this post on Linked In&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0Fh6LYWf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fqmjk1865hr2kk6vk05h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0Fh6LYWf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fqmjk1865hr2kk6vk05h.png" alt="Alt Text" width="560" height="777"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting started with Insomnia
&lt;/h2&gt;

&lt;p&gt;When I'm working with an API I like to document it using the &lt;a href="https://insomnia.rest/"&gt;Insomnia REST tool&lt;/a&gt; - it has the advantage of being both documentation and a testing environment - and you can download a partial Insomnia workspace that has the following functions set up &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication

&lt;ul&gt;
&lt;li&gt;Login&lt;/li&gt;
&lt;li&gt;Ping (API KEY)&lt;/li&gt;
&lt;li&gt;Ping (User Token&lt;/li&gt;
&lt;li&gt;GetUserToken (UserID)&lt;/li&gt;
&lt;li&gt;GetUserTiken (User Email)&lt;/li&gt;
&lt;li&gt;Logout&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Activities

&lt;ul&gt;
&lt;li&gt;Get Activities&lt;/li&gt;
&lt;li&gt;Get Activities (User)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Leads

&lt;ul&gt;
&lt;li&gt;Create a Lead&lt;/li&gt;
&lt;li&gt;Create and Lead and assign to user&lt;/li&gt;
&lt;li&gt;Create a Reminder&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/computamike"&gt;
        computamike
      &lt;/a&gt; / &lt;a href="https://github.com/computamike/youdontneedacrm"&gt;
        youdontneedacrm
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Notes and supporting information for the YouDontNeedACrm solution
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://insomnia.rest/run/?label=YDNAC&amp;amp;uri=https%3A%2F%2Fraw.githubusercontent.com%2Fcomputamike%2Fyoudontneedacrm%2Fmaster%2Finsomnia%2FYDNAC.json"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TpTjD2aP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://insomnia.rest/images/run.svg" alt="Run in Insomnia" width="135" height="30"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a very small subset of what the API can offer - but this is all the functionality I wanted to explore for the moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authentication
&lt;/h2&gt;

&lt;p&gt;The API docs say the following : &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In order to secure your transaction, we ask you to use one of your generated api key or your user token with any https transaction.&lt;/p&gt;

&lt;p&gt;In this version 2 of the API, you have the choice of making your requests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user not dependent using one of your API key: it is for the account and it grants you admin rights. Meaning if you create a lead for example with this api key without specifying a user, the lead won't belong to any specific user and will appear in the interface as an unassigned lead.&lt;/li&gt;
&lt;li&gt;user dependent using a USER token: all the requests will use the privacy of the users and some requests won't be allowed depending of the user rights.&lt;/li&gt;
&lt;li&gt;user not dependent using one of your API key: it is for the account and it grants you admin rights. Meaning if you create a lead for example with this api key without specifying a user, the lead won't belong to any specific user and will appear in the interface as an unassigned lead.
user dependent using a USER token: all the requests will use the privacy of the users and some requests won;t be allowed depending of the user rights.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Impersonation
&lt;/h2&gt;

&lt;p&gt;So the way the security model is set up is that you can use &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization"&gt;basic authentication&lt;/a&gt; to log in as a specific user.  Logging in will return a user token (it isn't known how long the user token exists for - but there is a specific call to invalidate - or logout.  You can now pass in the user token into all subsequent calls, and have every privilage that the user has.&lt;/p&gt;

&lt;p&gt;I think this is a little worrying, and not a stategy I would suggest to follow.  If a user leaves the group, or changes their password then scripts that have previously logged in as that user will no longer work.&lt;/p&gt;

&lt;p&gt;Instead I would suggest using the API key approach - something that YDNAC supports, and is (in my mind) a better approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Key.
&lt;/h2&gt;

&lt;p&gt;The API approach, allows a script using the API to identify using a key that can be activated, deactivated and even removed through the administration dashboard.  This doesn't tie the script to an individual user and is (in my mind) a more robust way of handling the authentication, and is more in line with what and how we'd expect to integrate with services - API Keys and tokens (as opposed to user credentials) seem to be the way that services like Twitter / Facebook / Github all handle authentication of systems that integrate with them.&lt;/p&gt;

&lt;p&gt;To create an API token, navigate to (YOURSITE)/admin/api_keys and click the Create an API key button.&lt;/p&gt;

&lt;h2&gt;
  
  
  Broken bits
&lt;/h2&gt;

&lt;p&gt;There are a few areas where I've found problems - primarily the Get &lt;code&gt;activities&lt;/code&gt; endpoint always seems to return a 403 (forbidden) error - I'm not sure why - maybe I need to add some activities?  &lt;/p&gt;

&lt;p&gt;There are references to getting activity ID's within the API documentation - but nothing really about how to set up an activity - I'll investigate more, but I also can't find anything about activity while looking on the UI.&lt;/p&gt;

&lt;p&gt;I also experienced a really strange error being returned from this REST API&lt;br&gt;
&lt;/p&gt;
&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VjDYqSmr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/EggPfSXUcAEvFuA.png" alt="unknown tweet media content"&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--2ovcAL2M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/907164740102889472/2rgltI2c_normal.jpg" alt="Mike Hingley profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Mike Hingley
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @computa_mike
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Hi &lt;a href="https://twitter.com/noCRM"&gt;@noCRM&lt;/a&gt; - I'm trying to call a rest API, and I get some very strange responses.  I get a 200 but in the body I get this : 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      11:19 AM - 28 Aug 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1299305527437033473" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1299305527437033473" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1299305527437033473" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;but that was down to be POSTing something to a GET endpoint - even so - surely it shouldn't return a 200 status - more likely a 405 error?&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;For my experimentation I set up a quick .NET class to talk to YDNAC.  I plan to take this class library further, and implement the full API.&lt;/p&gt;

</description>
      <category>rest</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Can't get to the footer of Dev.to</title>
      <dc:creator>Mike Hingley</dc:creator>
      <pubDate>Thu, 18 Feb 2021 01:26:37 +0000</pubDate>
      <link>https://dev.to/computamike/can-t-get-to-the-footer-of-dev-to-445b</link>
      <guid>https://dev.to/computamike/can-t-get-to-the-footer-of-dev-to-445b</guid>
      <description>&lt;p&gt;dev.to has an infinite scroll set up - so that makes it almost impossible for a user to access the content in the footer - because as soon as the footer is presented, the scroll system goes ahead a fetches more content.  &lt;/p&gt;

&lt;p&gt;So does that mean that in order to view the footer I need to view ALL of dev?  &lt;/p&gt;

&lt;p&gt;All i wanted to do was find the github link to see whether the Dark Mode issue has been reported or not...&lt;/p&gt;

</description>
    </item>
    <item>
      <title>CCHits on Docker</title>
      <dc:creator>Mike Hingley</dc:creator>
      <pubDate>Mon, 07 Dec 2020 18:21:21 +0000</pubDate>
      <link>https://dev.to/computamike/cchits-on-docker-2j5n</link>
      <guid>https://dev.to/computamike/cchits-on-docker-2j5n</guid>
      <description>&lt;p&gt;Hello World.  This is my first article on DEV - hopefully, part of a series on hacking (the good kind) on the CCHits Codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what is CCHits.net?
&lt;/h2&gt;

&lt;p&gt;From the website &lt;a href="https://cchits.net/" rel="noopener noreferrer"&gt;cchits.net&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CCHits.net is a site promoting and featuring Creative Commons licensed music and the podcasts that play them.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CCHits.net also generates an automatic podcast providing a daily exposure show and RSS feeds for Daily, Weekly shows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cchits.net/daily/rss" rel="noopener noreferrer"&gt;Daily Exposure Show RSS&lt;/a&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4J-hdoAc9yc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
CCHits Daily show for 06/06/2019



&lt;p&gt;CCHits is based on Linux - and uses tools like &lt;a href="http://festvox.org/festival/" rel="noopener noreferrer"&gt;festival&lt;/a&gt; and &lt;a href="http://sox.sourceforge.net/" rel="noopener noreferrer"&gt;sox&lt;/a&gt; to construct Podcast episodes.  Previously I would have suggested running &lt;a href="https://laravel.com/docs/8.x/homestead" rel="noopener noreferrer"&gt;Laravel Homestead&lt;/a&gt; - and I wrote a &lt;a href="https://github.com/CCHits/Website/wiki/Developing-on-Homestead" rel="noopener noreferrer"&gt;wikipage on the CCHits repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With the recent moves in the dev-ops arena towards &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;, this causes some issues for me - the main being the compatibility between Homestead (Virtual Box) and Docker (Hyper-V).  &lt;/p&gt;

&lt;p&gt;In this article, I'll use Docker to set up a couple of containers for the main website and a database - and go through some of the settings that are required to allow a developer to start hacking on the CCHits Codebase.&lt;/p&gt;

&lt;p&gt;At the moment, you can find the code on the &lt;a href="https://github.com/computamike/Website/tree/DockerSupport" rel="noopener noreferrer"&gt;DockerSupport&lt;/a&gt; branch.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/computamike" rel="noopener noreferrer"&gt;
        computamike
      &lt;/a&gt; / &lt;a href="https://github.com/computamike/Website" rel="noopener noreferrer"&gt;
        Website
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Docker File
&lt;/h2&gt;

&lt;p&gt;I've set up a docker file to stand up CCHits as a PHP5.6 / apache image and linked that up (using docker-compose) with a MySQL Server.&lt;/p&gt;

&lt;p&gt;Standing up the required infrastructure to run locally just requires executing the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose -f "docker-compose.yml" up -d --build 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once this is complete, there will be a website and MySQL 5.7 database server.  Fire your browser to &lt;a href="http://localhost" rel="noopener noreferrer"&gt;http://localhost&lt;/a&gt; and you should see...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi91rkk5o5x7bdiexywm4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi91rkk5o5x7bdiexywm4.png" alt="CCHits Front page showing no tracks or shows."&gt;&lt;/a&gt;&lt;/p&gt;
Main CCHits front page



&lt;h2&gt;
  
  
  Setting it all up.
&lt;/h2&gt;

&lt;p&gt;CCHits stores some of its configuration within the Database - so we'll need to set that up, and we'll need to set up a Google Application to do that.&lt;/p&gt;

&lt;p&gt;Set up a project on Google Developer Console at &lt;a href="https://console.developers.google.com/" rel="noopener noreferrer"&gt;https://console.developers.google.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set up some OAuth 2.0 Client IDs - Here's my set up : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl6017xi63t8510q0v3o1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl6017xi63t8510q0v3o1.png" alt="A screenshot of Google OAuth Set up to allow users to log into CCHits"&gt;&lt;/a&gt;&lt;/p&gt;
Google OAuth set up



&lt;p&gt;I've blurred out the credentials - but the important thing is to register some endpoints for the application.&lt;/p&gt;

&lt;p&gt;These need to be stored in the database in the config table in the following fields : &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;googleClientId&lt;/td&gt;
&lt;td&gt;Whatever is in your Google OAuth Settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;googleClientSecret&lt;/td&gt;
&lt;td&gt;Whatever is in your Google OAuth Settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;googleRedirectUri&lt;/td&gt;
&lt;td&gt;&lt;a href="http://127.0.0.1/oauth2callback" rel="noopener noreferrer"&gt;http://127.0.0.1/oauth2callback&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Firing your browser to &lt;a href="http://127.0.0.1/admin" rel="noopener noreferrer"&gt;http://127.0.0.1/admin&lt;/a&gt; should present the login page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F136nwr5kjumsyer0yl4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F136nwr5kjumsyer0yl4s.png" alt="CCHits Login Page"&gt;&lt;/a&gt;&lt;/p&gt;
CCHits Login Page



&lt;p&gt;As we have set up the Google Authentication, let's use that option to login using my google account.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fg3asbkwiuj9ztuvdxoeg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fg3asbkwiuj9ztuvdxoeg.png" alt="Loggin page, logging into CCHits using Google Authentication"&gt;&lt;/a&gt;&lt;/p&gt;
Logging in using Google Authentication



&lt;p&gt;Log in and boom...nothing happens... You're back at the login page.  This is because you're a user - you're even logged in... but you're not set up as an administrator.&lt;/p&gt;

&lt;h1&gt;
  
  
  With Great Power comes great responsibility
&lt;/h1&gt;

&lt;p&gt;To rectify this situation, connect to the MYSQL container (I'm using MySQL workbench here) and set the admin flag for your user to 1...&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fss6cywi2koe8urgldjr7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fss6cywi2koe8urgldjr7.png" alt="Using MySQL Workbench to update your user record to have an admin flag set to 1"&gt;&lt;/a&gt;&lt;/p&gt;
Setting your user record to have the admin flag



&lt;p&gt;Refresh your browser to glimpse behind the curtain, and behold the majesty that is the administration page on your local CCHits instance.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fguz7xv12fg5b8snr67v8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fguz7xv12fg5b8snr67v8.png" alt="Once logged in, the CCHits Administration screen"&gt;&lt;/a&gt;&lt;/p&gt;
CCHits Administration Screen



&lt;p&gt;In the next post, we'll look at configuring a music provider and setting up Xdebug using VSCode.&lt;/p&gt;

</description>
      <category>php</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
