<?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: Sharon Wang</title>
    <description>The latest articles on DEV Community by Sharon Wang (@sharonwang554).</description>
    <link>https://dev.to/sharonwang554</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4100316%2Fc07a5cc1-78bd-4105-a753-766f304dd973.jpeg</url>
      <title>DEV Community: Sharon Wang</title>
      <link>https://dev.to/sharonwang554</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sharonwang554"/>
    <language>en</language>
    <item>
      <title>The Missing Guide to Canvas LMS OAuth 2.0 Integration</title>
      <dc:creator>Sharon Wang</dc:creator>
      <pubDate>Fri, 11 Sep 2026 13:32:16 +0000</pubDate>
      <link>https://dev.to/sharonwang554/the-missing-guide-to-canvas-lms-oauth-20-integration-2ab1</link>
      <guid>https://dev.to/sharonwang554/the-missing-guide-to-canvas-lms-oauth-20-integration-2ab1</guid>
      <description>&lt;p&gt;The OAuth 2.0 protocol provides a secure mechanism for a third-party application (the Client) to access user information stored in Canvas LMS without requiring the user to share their Canvas credentials directly. &lt;/p&gt;

&lt;p&gt;When an instructor links their account with a third-party application, they are redirected to the Canvas SSO login page. Upon successful authentication and consent, the application is granted authorized access to the instructor's Canvas data. This linked state enables core integrations, such as importing student rosters and exporting grades seamlessly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Terminology Reference
&lt;/h2&gt;

&lt;p&gt;Understanding OAuth 2.0 requires defining the specific roles each system component plays:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition &amp;amp; Context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource Owner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The end-user (e.g., the instructor) who grants access to their data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Client&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your application requesting access to the user's information.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Authorization Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The system that authenticates the user and issues access tokens. &lt;strong&gt;Canvas LMS&lt;/strong&gt; acts as the authorization server.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Authorization Grant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A credential representing the resource owner's consent. The client exchanges this grant for an access token.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access Token (Bearer)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The secure key used by the client to access protected resources on behalf of the user.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The system hosting the protected user accounts and information. It verifies the access token before responding.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Redirect URI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The pre-registered destination where the authorization server sends the user after granting consent.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The specific permissions granted by the end-user (e.g., reading course lists, fetching enrollments).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Client ID &amp;amp; Secret&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The unique credentials used to identify and authenticate your application to the authorization server.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Authorization Code Flow
&lt;/h2&gt;

&lt;p&gt;Canvas LMS implements the &lt;strong&gt;Authorization Code Flow&lt;/strong&gt;, which is the most common and secure OAuth 2.0 flow for server-side applications. The process is divided into front-channel (browser-based) and back-channel (server-to-server) communications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sequence Diagram
&lt;/h3&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    participant User as Resource Owner (Instructor)
    participant Client as Client Application
    participant AuthServer as Authorization Server (Canvas)
    participant ResourceServer as Resource Server (Canvas)

    Note over User, AuthServer: Front-Channel Flow
    User-&amp;gt;&amp;gt;Client: Initiates account linking
    Client-&amp;gt;&amp;gt;User: Redirects to Canvas Authorization URL
    User-&amp;gt;&amp;gt;AuthServer: Enters credentials &amp;amp; grants consent
    AuthServer-&amp;gt;&amp;gt;User: Redirects to Client Redirect URI with Auth Code
    User-&amp;gt;&amp;gt;Client: Passes Auth Code via Redirect

    Note over Client, ResourceServer: Back-Channel Flow
    Client-&amp;gt;&amp;gt;AuthServer: POST Auth Code, Client ID, Client Secret
    AuthServer--&amp;gt;&amp;gt;Client: Returns Access Token &amp;amp; Refresh Token
    Client-&amp;gt;&amp;gt;ResourceServer: API Request + Access Token
    ResourceServer--&amp;gt;&amp;gt;Client: Returns Requested Data&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  1. Requesting User Consent (Front-Channel)
&lt;/h3&gt;

&lt;p&gt;To begin the flow, your application redirects the user's browser to the Canvas authorization endpoint:&lt;br&gt;
&lt;code&gt;GET https://&amp;lt;canvas-instance&amp;gt;/login/oauth2/auth&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Include the following query parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;client_id&lt;/code&gt;: Your application's unique ID.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;response_type&lt;/code&gt;: Set to &lt;code&gt;code&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;redirect_uri&lt;/code&gt;: The endpoint in your application that will handle the callback.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scope&lt;/code&gt;: (Optional) A space-separated list of required scopes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The user logs into Canvas and is prompted to authorize the application. Upon consent, Canvas redirects the user back to the &lt;code&gt;redirect_uri&lt;/code&gt;, appending a temporary &lt;strong&gt;authorization code&lt;/strong&gt; to the URL query string (&lt;code&gt;?code=...&lt;/code&gt;).&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Exchanging the Code for a Token (Back-Channel)
&lt;/h3&gt;

&lt;p&gt;Your application extracts the authorization code and securely sends a background POST request to the Canvas token endpoint:&lt;br&gt;
&lt;code&gt;POST https://&amp;lt;canvas-instance&amp;gt;/login/oauth2/token&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Include the following URL‑encoded form data (not JSON):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grant_type=authorization_code&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client_id=YOUR_CLIENT_ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client_secret=YOUR_CLIENT_SECRET&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;redirect_uri=YOUR_REDIRECT_URI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;code=AUTHORIZATION_CODE_FROM_REDIRECT&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Replace &lt;code&gt;&amp;lt;canvas-instance&amp;gt;&lt;/code&gt; throughout this guide with the actual domain of your Canvas LMS instance (e.g., &lt;code&gt;canvas.instructure.com&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Canvas validates the credentials and returns a JSON response containing the &lt;code&gt;access_token&lt;/code&gt;, a &lt;code&gt;refresh_token&lt;/code&gt;, and the &lt;code&gt;expires_in&lt;/code&gt; duration (typically 3600 seconds).&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Making Authenticated API Requests
&lt;/h3&gt;

&lt;p&gt;Your application stores these tokens securely and utilizes the &lt;code&gt;access_token&lt;/code&gt; in the &lt;code&gt;Authorization&lt;/code&gt; header of subsequent API requests to the Canvas Resource Server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/api/v1/courses&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;canvas-instance&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer &amp;lt;access_token&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Refreshing Expired Tokens
&lt;/h3&gt;

&lt;p&gt;Access tokens possess a limited lifespan. Before making API calls, your application should validate the token's temporal validity. If the token is expired, issue a refresh request to the token endpoint:&lt;br&gt;
&lt;code&gt;POST https://&amp;lt;canvas-instance&amp;gt;/login/oauth2/token&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Include the following payload:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;grant_type&lt;/code&gt;: Set to &lt;code&gt;refresh_token&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;client_id&lt;/code&gt;: Your application's unique ID.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;client_secret&lt;/code&gt;: Your application's secure secret key.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;refresh_token&lt;/code&gt;: The refresh token received in step 2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Upon success, the new &lt;code&gt;access_token&lt;/code&gt; and updated expiration timestamp should be persisted to your database.&lt;/p&gt;


&lt;h2&gt;
  
  
  Example HTTP Request (cURL)
&lt;/h2&gt;

&lt;p&gt;To execute the back-channel token exchange, you can make a standard POST request to the token endpoint. &lt;/p&gt;

&lt;p&gt;Because the OAuth 2.0 specification requires token requests to be formatted as form data (rather than JSON), ensure you use the &lt;code&gt;-d&lt;/code&gt; flag in your &lt;code&gt;curl&lt;/code&gt; command to send the payload as &lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://canvas.instructure.com/login/oauth2/token &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/x-www-form-urlencoded"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"grant_type=authorization_code"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"client_id=YOUR_CLIENT_ID"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"client_secret=YOUR_CLIENT_SECRET"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"redirect_uri=https://api.your-app.com/oauth/callback"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"code=AUTHORIZATION_CODE_FROM_REDIRECT"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"access_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8489~TOKEN_STRING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12345&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jane Doe"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"refresh_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8489~REFRESH_TOKEN_STRING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>oauth</category>
      <category>authentication</category>
      <category>authorization</category>
      <category>canvaslms</category>
    </item>
    <item>
      <title>Zero to Running: Setting up a Canvas LMS Dev Environment with Docker on AWS EC2</title>
      <dc:creator>Sharon Wang</dc:creator>
      <pubDate>Fri, 11 Sep 2026 13:24:13 +0000</pubDate>
      <link>https://dev.to/sharonwang554/zero-to-running-setting-up-a-canvas-lms-dev-environment-with-docker-10c2</link>
      <guid>https://dev.to/sharonwang554/zero-to-running-setting-up-a-canvas-lms-dev-environment-with-docker-10c2</guid>
      <description>&lt;p&gt;This runbook outlines the manual infrastructure provisioning process used strictly for initial integration testing. While manual setup is sufficient for early staging, a production-grade Developer Experience (DevEx) implementation would automate this using EC2 user-data scripts or Terraform to bootstrap the Mutagen containers on launch—eliminating the need for developers to manually SSH into the instance or manage server security concerns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;If you need to provision a Canvas instance from scratch rather than using the existing pre-configured AWS server, ensure the host machine has the following dependencies installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/downloads" rel="noopener noreferrer"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; &amp;amp; &lt;a href="https://docs.docker.com/compose/install/" rel="noopener noreferrer"&gt;Docker Compose&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mutagen.io/documentation/introduction/installation" rel="noopener noreferrer"&gt;Mutagen&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/mutagen-io/mutagen-compose" rel="noopener noreferrer"&gt;Mutagen Compose&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/FreedomBen/dory#installation" rel="noopener noreferrer"&gt;Dory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Caution: Environment Variances&lt;/strong&gt;&lt;br&gt;
Installation commands vary based on the host operating system (e.g., using &lt;code&gt;yum&lt;/code&gt; on Amazon Linux versus &lt;code&gt;apt-get&lt;/code&gt; on Ubuntu/Debian). Furthermore, Canvas is highly memory-intensive; ensure your EC2 instance is sufficiently provisioned to avoid out-of-memory (OOM) crashes. Ensure all necessary firewall ports are open for HTTP/HTTPS traffic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For a comprehensive from-scratch installation guide, refer to the &lt;a href="https://github.com/instructure/canvas-lms/wiki/Quick-Start" rel="noopener noreferrer"&gt;Canvas LMS GitHub Repository Quick Start&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Starting the Canvas Instance
&lt;/h2&gt;

&lt;p&gt;Follow these steps to boot the pre-configured Canvas testing environment on AWS:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. SSH into the Host Server:&lt;/strong&gt; Connect to your designated EC2 instance. You can find the public IPv4 address for the testing server in the &lt;a href="https://console.aws.amazon.com/ec2/" rel="noopener noreferrer"&gt;AWS EC2 dashboard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Clone the &lt;a href="https://github.com/instructure/canvas-lms" rel="noopener noreferrer"&gt;Canvas LMS Source Repository&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/instructure/canvas-lms.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3. Navigate to the Repository:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd canvas-lms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;4. Initialize the Dev Setup (First Time Only):&lt;/strong&gt; If the instance is not already running, execute the setup script.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./script/docker_dev_setup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: This process takes significant time. When prompted to create an administrator account, provide a testing email address.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Start the Containers:&lt;/strong&gt; Spin up the Docker stack using Mutagen.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mutagen-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;6. Verify Container Health:&lt;/strong&gt; Ensure all containers booted successfully.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps -a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;7. Access the Web Interface:&lt;/strong&gt; Replace &lt;code&gt;&amp;lt;EC2_PUBLIC_IPV4_ADDRESS&amp;gt;&lt;/code&gt; with the actual public IPv4 address of your EC2 instance. Open your browser and navigate to &lt;code&gt;http://&amp;lt;EC2_PUBLIC_IPV4_ADDRESS&amp;gt;&lt;/code&gt;. Log in using the testing credentials established during step 4.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Generating the OAuth Developer Key
&lt;/h2&gt;

&lt;p&gt;To allow your application to communicate with Canvas, you must register it as an authorized client application.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Navigate to Developer Keys:&lt;/strong&gt; Within the Canvas web interface, click &lt;strong&gt;Admin&lt;/strong&gt; &amp;gt; &lt;strong&gt;Site Admin&lt;/strong&gt; &amp;gt; &lt;strong&gt;Developer Keys&lt;/strong&gt; from the left sidebar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a New Key:&lt;/strong&gt; Click &lt;strong&gt;+ Developer Key&lt;/strong&gt; &amp;gt; &lt;strong&gt;+ API Key&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure Key Parameters:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Key Name:&lt;/strong&gt; &lt;code&gt;Local Integration Testing&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner Email:&lt;/strong&gt; Enter your designated testing admin email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redirect URIs:&lt;/strong&gt; Enter your application's OAuth callback URL (e.g., &lt;code&gt;https://api.your-app.com/oauth/callback&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redirect URI (Legacy):&lt;/strong&gt; (Enter the same URI as above to prevent legacy routing issues).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforce Scopes:&lt;/strong&gt; Toggle &lt;strong&gt;Enforce Scopes&lt;/strong&gt; and select the specific API endpoints required by your application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save and Extract Credentials:&lt;/strong&gt; Click &lt;strong&gt;Save Key&lt;/strong&gt;. The system will generate two critical values:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client ID:&lt;/strong&gt; The numerical string visible under the "Details" column.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Secret:&lt;/strong&gt; Click &lt;strong&gt;Show Key&lt;/strong&gt; to reveal the alphanumeric secret. &lt;em&gt;Store these securely.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your Canvas instance is now actively running and configured to accept OAuth 2.0 requests from your client application!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>aws</category>
      <category>ec2</category>
      <category>canvaslms</category>
    </item>
  </channel>
</rss>
