<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.3">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2023-07-24T21:04:55+00:00</updated><id>/feed.xml</id><title type="html">Anthology Dev docs</title><subtitle>This site has been created in order to allow our Client's developers to review our documentation and APIs to develop awesome new applications!</subtitle><entry><title type="html">DevCon 2022 Presentations!</title><link href="/blog/2022/07/12/DevCon2022.html" rel="alternate" type="text/html" title="DevCon 2022 Presentations!" /><published>2022-07-12T00:00:00+00:00</published><updated>2022-07-12T00:00:00+00:00</updated><id>/blog/2022/07/12/DevCon2022</id><content type="html" xml:base="/blog/2022/07/12/DevCon2022.html">&lt;h1 id=&quot;devcon-2022-presentations&quot;&gt;DevCon 2022 Presentations!&lt;/h1&gt;

&lt;p&gt;We will be adding sessions here as soon as we get the presentations! If you want to see your DevCon presentation, please write us at developers@anthology.com. All times are in ET.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Day 1 @ DevCon 2022&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;bb-rest-helper&quot;&gt;BB Rest Helper&lt;/h3&gt;

&lt;p&gt;⏲ 1:00 PM - 1:45 PM Session
&lt;br /&gt;
👨‍💻 &lt;strong&gt;Presenter:&lt;/strong&gt; Javier Gregori&lt;/p&gt;

&lt;p&gt;Creating a proof of concept for an integration from scratch can be tedious, there are many basic elements such API authentication or logs that will need to be sorted out before being able to work on meaningful code, and even then, lots of code will need to be written and tested for API Requests.
This library abstracts the common and boring operations that Blackboard developers face when interfacing with the REST API so they can focus their effort in creating the cool features they need for their integrations.
This library is intended to explore Blackboard REST APIs and to help create POCs for integrations. Please note this tool is not supported by Blackboard and no warranties of any kind are provided.
In this presentation you will get to know the Bb_rest_helper library, and how to set up with Visual studio code and Jupyter notebooks to make the REST of your life easier&lt;/p&gt;

&lt;h4 id=&quot;description&quot;&gt;Description&lt;/h4&gt;

&lt;p&gt;The Bb Rest Helper includes 5 classes to simpilfy common API operations with Blackboard APIs;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Get_Config. This class is used to get configuration variables (url,key,secret)from an external configuration file in Json format. If you are authenticating for more than one API (i.e. Learn and Collaborate) you will need separate configuration files (i.e. learn_config.json and collab_config.json).&lt;/li&gt;
  &lt;li&gt;Auth_Helper. This class is used to get the token that then will be used in the API calls. Provides different methods for the different APIs.&lt;/li&gt;
  &lt;li&gt;Bb_Requests. This class is used to simplify calls to the Blackboard Rest APIs. Provides methods for GET, POST, PUT, PATCH and DELETE requests.&lt;/li&gt;
  &lt;li&gt;Bb_Utils. A set of convenience functions (Logging, printing…), this will be extended over time.&lt;/li&gt;
  &lt;li&gt;Ally_Helper This class is used to simplify interaction with Ally as a service, includes methods to authenticate, upload a file, check processing status and retrieve the feedback. As it is an initial release for this API with limited features, it is implemented as a separate class to provide easier access to these methods rather than having to code them manually or with the Bb_rest_helper library.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;companion-links&quot;&gt;Companion Links&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/JgregoriBb/Bb_rest_helper&quot;&gt;Javier’s GitRepo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://pypi.org/project/Bb-rest-helper/&quot;&gt;Pypi project link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;presentation-pdf&quot;&gt;Presentation PDF&lt;/h4&gt;

&lt;object data=&quot;/assets/files/devcon2022-bbresthelper.pdf&quot; width=&quot;100%&quot; height=&quot;600&quot; type=&quot;application/pdf&quot;&gt;&lt;/object&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Day 2 @ DevCon 2022&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;blackboard-learn-rest-apis-for-beginners&quot;&gt;Blackboard Learn REST APIs for Beginners&lt;/h3&gt;

&lt;p&gt;⏲ 11:40 AM - 12:25 AM Session
&lt;br /&gt;
👨‍💻 &lt;strong&gt;Presenter:&lt;/strong&gt; Davey Herrera&lt;/p&gt;

&lt;h4 id=&quot;presentation-pdf-1&quot;&gt;Presentation PDF&lt;/h4&gt;

&lt;object data=&quot;/assets/files/devcon2022-restapi4beginners.pdf&quot; width=&quot;100%&quot; height=&quot;600&quot; type=&quot;application/pdf&quot;&gt;&lt;/object&gt;

&lt;h4 id=&quot;video-companion&quot;&gt;Video companion&lt;/h4&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;600&quot; src=&quot;https://www.youtube.com/embed/fOo04uMcsDA&quot; title=&quot;Blackboard Learn REST API for beginners&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h3 id=&quot;migrating-a-b2-to-lti--rest-deep-dive&quot;&gt;Migrating a B2 to LTI &amp;amp; REST Deep dive&lt;/h3&gt;

&lt;p&gt;⏲ 1:45 PM - 3:00 PM Session
&lt;br /&gt;
👨‍💻 &lt;strong&gt;Presenter:&lt;/strong&gt; Eric Preston&lt;/p&gt;

&lt;object data=&quot;/assets/files/devcon2022-migratingb2toltiandrest.pdf&quot; width=&quot;100%&quot; height=&quot;600&quot; type=&quot;application/pdf&quot;&gt;&lt;/object&gt;

&lt;h3 id=&quot;moving-to-ultra-a-phased-approach&quot;&gt;Moving to Ultra: A Phased Approach&lt;/h3&gt;

&lt;p&gt;⏲ 4:15 PM - 5:00 PM Session
&lt;br /&gt;
👩‍💻 &lt;strong&gt;Presenter:&lt;/strong&gt; Michelle Donaldson&lt;/p&gt;

&lt;object data=&quot;/assets/files/devcon2022-moving2ultra-phasedaoproach.pdf&quot; width=&quot;100%&quot; height=&quot;600&quot; type=&quot;application/pdf&quot;&gt;&lt;/object&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Day 3 @ DevCon 2022&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;making-ultra-your-own-uef-for-beginners&quot;&gt;Making ultra your own: UEF for Beginners&lt;/h3&gt;

&lt;p&gt;⏲ 11:30 PM - 12:15 PM Session
&lt;br /&gt;
👨‍💻 &lt;strong&gt;Presenter:&lt;/strong&gt; Chris Filkins&lt;/p&gt;

&lt;p&gt;For years, many of us have relied on Building Blocks as a way to add features and functionality into our Blackboard Learn courses. One of the best tools we ever used was the javascript Hacks tool, which leveraged the renderingHook function to allow a system administrator to further modify and customize their Learn environment with custom tools, banner, footers, etc. Unfortunately, the Ultra experience no longer supports the renderingHook function, removing the key mechanism for these customizations.&lt;/p&gt;

&lt;p&gt;In order to restore some of these capabilities, Blackboard Learn implemented a new feature set called the Ultra Extension Framework (UEF). This new framework opens a number of doors for developers to once again customize and extend their Blackboard Learn environments after switching to the Ultra experience. The Ultra Extension Framework consists of two key components – telemetry data for user activity, and injection points to add content at various locations within the Ultra interface.&lt;/p&gt;

&lt;p&gt;The telemetry data can include a number of different events, including hover, click, route, as well as portal windows being created and removed. After initially launching as an LTI tool, an UEF tool can subscribe to any number of these events, and typically runs as javascript inside of a hidden iframe within the Ultra interface. From there, the custom script can then submit requests to the Ultra interface to create new panels, banners, notifications, popups, or even a custom help provider.&lt;/p&gt;

&lt;p&gt;The attached presentation will provide some sample code snippets from projects that we have deployed in our production environment, including banners and custom help providers.&lt;/p&gt;

&lt;object data=&quot;/assets/files/devcon2022-makingultrayourown.pdf&quot; width=&quot;100%&quot; height=&quot;600&quot; type=&quot;application/pdf&quot;&gt;&lt;/object&gt;

&lt;h3 id=&quot;best-practices-for-building-your-lti-advantage--rest-applications-for-learn-from-registration-through-release&quot;&gt;Best Practices for Building Your LTI Advantage &amp;amp; REST Applications For Learn, From Registration through Release&lt;/h3&gt;

&lt;p&gt;⏲ 9:00 AM - 9:45 PM Session
&lt;br /&gt;
👨‍💻 &lt;strong&gt;Presenter:&lt;/strong&gt; Mark Kauffman&lt;/p&gt;

&lt;p&gt;In this session Mark will give best practices for integrations that use LTI 1.3 and/or the Blackboard Learn REST APIs. There are many ways to improve your integration’s performance and use, beginning with registration on the developer portal through the day it’s installed on client systems. Given Mark’s extensive experience working with 3rd-party integrations, he’s selected those commonly missed best practices that, when you use them, will position your integration for maximum success.&lt;/p&gt;

&lt;object data=&quot;/assets/files/devcon2022-bp4bLTIadvantageandRESTapp4learn.pdf&quot; width=&quot;100%&quot; height=&quot;600&quot; type=&quot;application/pdf&quot;&gt;&lt;/object&gt;</content><author><name>Davey Herrera</name></author><category term="blog" /><category term="devcon" /><category term="community" /><category term="recap" /><category term="2022" /><summary type="html">DevCon 2022 Presentations!</summary></entry><entry><title type="html">LTI 1.3 tools must generate their own keys and JWKS URL</title><link href="/blog/2021/07/22/LTI-1.3-tools-must-generate-their-own-keys-and-JWKS-URL.html" rel="alternate" type="text/html" title="LTI 1.3 tools must generate their own keys and JWKS URL" /><published>2021-07-22T12:46:00+00:00</published><updated>2021-07-22T12:46:00+00:00</updated><id>/blog/2021/07/22/LTI%201.3%20tools%20must%20generate%20their%20own%20keys%20and%20JWKS%20URL</id><content type="html" xml:base="/blog/2021/07/22/LTI-1.3-tools-must-generate-their-own-keys-and-JWKS-URL.html">&lt;h1 id=&quot;lti-13-tools-must-generate-their-own-keys-and-jwks-url&quot;&gt;LTI 1.3 tools must generate their own keys and JWKS URL&lt;/h1&gt;

&lt;p&gt;When we started supporting LTI 1.3/Advantage (back in May of 2019) we chose to generate public/private key pairs for the tools. The tool vendor was then responsible for copying and storing those values on their side.&lt;/p&gt;

&lt;p&gt;But the &lt;a href=&quot;https://imsglobal.org&quot;&gt;IMS Global&lt;/a&gt; community has moved away from that model and now suggests that tool vendors generate their own key pairs for LTI authentication and provide their public key via a &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7517&quot;&gt;JWKS URL&lt;/a&gt;. This model is more secure because there is not copying of a private key and allows the LTI Tool provider to follow best practices with key rotation.&lt;/p&gt;

&lt;p&gt;We decided to follow that suggestion. If you want to register a new tool with Learn, you have to provide the JWKS URL information. And if you have an existing tool that use the Anthology-generated private key, please keep in mind that we’ll be terminating support in the near future.&lt;/p&gt;

&lt;p&gt;NOTE: Once you’ve made the change, you must have our mutual clients redeploy your LTI 1.3 tool. Redeploy means the following:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Admin -&amp;gt; Integrations, LTI Tool Providers -&amp;gt; Register LTI 1.3/Advantage Tool&lt;/li&gt;
  &lt;li&gt;Enter the same client ID for your tool that was previously deployed. Click the [Submit] Button.&lt;/li&gt;
  &lt;li&gt;Your tool will be redeployed to use your new JWKS URL.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Follow the above steps exactly. Do NOT have them delete the integration as that will destroy all existing links to your tool, which can not be recovered.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://youtu.be/M_d8-G-hGlI&quot;&gt;Here is a video explanation&lt;/a&gt; of both the steps you need to take to update your tool’s JWKS URL and the step you will need to have our mutual clients take. Note that after you update your tool’s JWKS URL on the developer portal our mutual clients will NOT able to use your product until after they redeploy as described above and in the video.&lt;/p&gt;

&lt;p&gt;FAQ:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Is this just a background change, and it will not impact anything on the front end?&lt;br /&gt;
-&amp;gt; There is no impact to how our mutual clients use the LTI Tool or Learn.&lt;/li&gt;
  &lt;li&gt;Does making the change at the central location serve the purpose, or are we required to plan anything around individual connections for separate schools?&lt;br /&gt;
-&amp;gt; You will need to work with the individual schools to ensure that after you make the chage they redploy your tool as described above.&lt;/li&gt;
  &lt;li&gt;Will schools transition seamlessly once we transition from a static public key to keyset URL (JWKS), or does it require any intervention from the Black side or the school admins?&lt;br /&gt;
-&amp;gt; The school admins will need to redeploy your tool as described above.&lt;/li&gt;
  &lt;li&gt;Currently, both static public key and keyset URL (JWKS) are going through successfully. Is it because Anthology hasn’t yet discontinued supporting the static public key?&lt;br /&gt;
-&amp;gt; Anthology will continue supporting the keys that were originally provided until further notice, likely until the end of 2022*.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As always, if you have any questions, check out the &lt;a href=&quot;/community/contact&quot;&gt;contact us page&lt;/a&gt; and let us know!&lt;/p&gt;

&lt;p&gt;*Statements regarding our product development initiatives, including new products and future product upgrades, updates or enhancements represent our current intentions, but may be modified, delayed or abandoned without prior notice and there is no assurance that such offering, upgrades, updates or functionality will become available unless and until they have been made generally available to our customers.&lt;/p&gt;</content><author><name>Eric Preston</name></author><category term="blog" /><category term="standards" /><category term="lti" /><category term="keys" /><summary type="html">LTI 1.3 tools must generate their own keys and JWKS URL</summary></entry><entry><title type="html">Use One-Time Session Token to Authenticate with UEF</title><link href="/blog/2021/05/10/use-one-time-session-tokens-instead-of-cookies-for-UEF-authentication.html" rel="alternate" type="text/html" title="Use One-Time Session Token to Authenticate with UEF" /><published>2021-05-10T16:13:00+00:00</published><updated>2021-05-10T16:13:00+00:00</updated><id>/blog/2021/05/10/use%20one%20time%20session%20tokens%20instead%20of%20cookies%20for%20UEF%20authentication</id><content type="html" xml:base="/blog/2021/05/10/use-one-time-session-tokens-instead-of-cookies-for-UEF-authentication.html">&lt;h1 id=&quot;use-one-time-session-token-to-authenticate-with-uef&quot;&gt;Use One-Time Session Token to Authenticate with UEF&lt;/h1&gt;

&lt;p&gt;In testing with the &lt;a href=&quot;https://www.google.com/chrome/canary/&quot;&gt;Google Canary Chrome Browser&lt;/a&gt;, one of our clients discovered an issue that was blocking users from logging in to their Learn instance. After much troubleshooting, we discovered a multi-layer issue that brings us to, you guessed it, &lt;a href=&quot;https://docs.blackboard.com/blog/2020/10/15/Cookies-and-Browsers&quot;&gt;cookies&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;This affects clients in SaaS with Ultra Base Navigation enabled using Ultra integrations that rely on UEF&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is a brief description of the contributing factors:&lt;/p&gt;

&lt;p&gt;First, the client had built a custom Ultra login page. The page included code designed to ensure that Learn login pages would never render inside of an iframe within Learn. It looks like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;if ( top != self )
{
    top.location.replace( self.location.href );
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In and of itself there’s nothing wrong with it. We, at Anthology, have removed it from the default Ultra login page, but many clients use it in Original login pages, and so it’s moved with them into Ultra.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you are unsure whether you have a custom login page, visit &lt;a href=&quot;https://help.blackboard.com/Learn/Administrator/SaaS/User_Interface_Options/Ultra_Experience/Institution_Branding/Customize_the_Login_Page&quot;&gt;help.blackboard.com&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Secondly, when a user logged in, Ultra Extensions automatically fired off an LTI launch to UEF-enabled tools. The way UEF works is: after the LTI launch is validated, the tool redirects to the Learn REST endpoint to initiate a UserAuth flow. In our documentation, we call this a Three-Legged OAuth or &lt;a href=&quot;https://docs.blackboard.com/learn/rest/getting-started/3lo&quot;&gt;3LO&lt;/a&gt;. In most cases, it’s a process that relies on a session cookie to hold everything together. This impending release of Chrome (and other browsers) will block this cookie because everything is happening across domains and involves the use of iframes.&lt;/p&gt;

&lt;p&gt;So what happens is that, even though the integration is configured in Learn to not force the end-user to authorize the integration, the lack of the session cookie means that Learn has no idea that this user is logged in, so it pops open the login page.&lt;/p&gt;

&lt;p&gt;Remember that code snippet above in the custom login page? Well, that takes over the entire browser page with the Learn login. And when the user logs in again, it renders the JavaScript meant for the UEF iframe into the page. In other words, it overtakes your Learn browser session. There is no way to actually get past that screen.&lt;/p&gt;

&lt;p&gt;Related, this same issue affects Safari users when &lt;a href=&quot;https://support.apple.com/guide/safari/prevent-cross-site-tracking-sfri40732/mac&quot;&gt;cross-site tracking is disabled&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;so-what-can-you-do&quot;&gt;So what can you do?&lt;/h2&gt;

&lt;p&gt;Well, that depends upon who is reading this blog. If you are an administrator trying to get your users back in Learn, the most immediate fix is to remove that snippet from your login page. It won’t fix your broken UEF integration, but it will at least let your users log in and interact with Learn.&lt;/p&gt;

&lt;p&gt;If you are a developer that has built a UEF integration, we actually implemented a fix for this in April: a way to bypass the need for a session cookie in this process. In the LTI launch, we now provide what is called a one-time session cookie. This is present in both LTI 1.1 and 1.3 launches.&lt;/p&gt;

&lt;p&gt;If you are using LTI 1.3, there’s a small bug in this. I will share a workaround that will both get around this bug, but not fail when the bug is fixed.&lt;/p&gt;

&lt;p&gt;This one-time session cookie is added to the claims in the LTI 1.3 JWT and the form POST parameters in LTI 1.1. You can grab that value from the LTI launch, return it as a parameter in your 3LO authorization code request, and your problem will be solved.&lt;/p&gt;

&lt;h3 id=&quot;lti13&quot;&gt;LTI 1.3&lt;/h3&gt;

&lt;p&gt;In LTI 1.3, you will see the value in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://blackboard.com/lti/claim/one_time_session_token&lt;/code&gt; claim. This token is made up of a specially generated token value. It should also be followed by a comma and the user’s UUID. The bug is that the comma is missing. Luckily, the user’s UUID is the sub token in the same set of LTI claims. We intend to fix this, but to ensure your code works both now and after the fix, you can simply look for the comma. If it’s not there, append it and the sub and you will be off and running. Here’s a Python 3 code snippet to illustrate how this might look. We will be updating our UEF sample code, but at the time of this writing, we have not done so.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    # Get the value of the one time session token from the LTI claim
    one_time_session_token  = message_launch_data['https://blackboard.com/lti/claim/one_time_session_token']

    # If there is no comma in the value, we've hit the bug. Add it and the user's UUID
    if &quot;,&quot; not in one_time_session_token:
        one_time_session_token += &quot;,&quot; + message_launch_data['sub']

    # Add the one_time_session_token to the query parameters to send to the Authorization Code endpoint
    params = {
        'redirect_uri' : Config.config['app_url'] + '/authcode/',
        'response_type' : 'code',
        'client_id' : Config.config['learn_rest_key'],
        'one_time_session_token' : one_time_session_token,
        'scope' : '*',
        'state' : str(uuid.uuid4())
    }

    # Encode the parameters
    encoded_params = urllib.parse.urlencode(params)

    # Redirect the successful LTI validation to the Authorization Code endpoint
    return(redirect(learn_url + '/learn/api/public/v1/oauth2/authorizationCode?' + encoded_params))
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;lti11&quot;&gt;LTI 1.1&lt;/h3&gt;

&lt;p&gt;By now, I hope you are using LTI 1.3, but I know many are not. As a result, we also added a one-time session token to LTI 1.1 launches. This will come in the form POST parameter &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ext_one_time_session_token&lt;/code&gt;. Just like in the 1.3 example, your application should take this value from the LTI launch, append it to the authorization code request endpoint as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;one_time_session_token=that_token&lt;/code&gt; and redirect them to the authorization code endpoint.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;We have validated this fix with one of the partners that was affected. If you are a developer, please fix the issue immediately! If you are an administrator of a Learn SaaS instance using Ultra, and you have UEF integrations, make sure you do not have that JavaScript snippet on your login page. And if you do, please remove it. Then let your UEF integration partners and developers know that this fix must be made as soon as possible.&lt;/p&gt;

&lt;p&gt;Regardless of whether you are an administrator or a developer, please feel free to reach out to us at developers@anthology.com with any questions.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;</content><author><name>Scott Hurrey</name></author><category term="blog" /><category term="uef" /><category term="ultra" /><category term="lti" /><category term="rest" /><summary type="html">Use One-Time Session Token to Authenticate with UEF</summary></entry><entry><title type="html">How to Create a User With Limited Entitlements For REST API Calls</title><link href="/blog/2021/01/06/How-to-Create-a-User-With-Limited-Entitlements-For-REST-API-Calls.html" rel="alternate" type="text/html" title="How to Create a User With Limited Entitlements For REST API Calls" /><published>2021-01-06T12:59:00+00:00</published><updated>2021-01-06T12:59:00+00:00</updated><id>/blog/2021/01/06/How%20to%20Create%20a%20User%20With%20Limited%20Entitlements%20For%20REST%20API%20Calls</id><content type="html" xml:base="/blog/2021/01/06/How-to-Create-a-User-With-Limited-Entitlements-For-REST-API-Calls.html">&lt;h1 id=&quot;how-to-create-a-user-with-limited-entitlements-for-rest-api-calls&quot;&gt;How to Create a User With Limited Entitlements For REST API Calls&lt;/h1&gt;

&lt;p&gt;First, as our documentation states, a Learn admin should never be told to associate a user with Learn admin privileges with any REST API integration, see this document. Hence we often get questions from folks on how to create a user to associate with a REST API integration that has limited capability on a Learn system. One way is to research and design your REST application to use OAuth 2 3-legged Authentication. See the documents referenced below. 3LO guarentees that the user using your REST Application can only do what they can do via the Learn UX when they are logged into Learn.&lt;/p&gt;

&lt;p&gt;However, if your application is using our OAuth 2 2-legged Authentication read on. Or I should say, watch on. I created the following to answer the question “Is it possible to create a user that has only the necessary permissions and avoid using “Learn System Admin” user?”&lt;/p&gt;

&lt;p&gt;The answer is yes! &lt;a href=&quot;https://youtu.be/uyKdbCpcZMc&quot;&gt;Here’s a video explaining exactly how to proceed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Reference Documentation:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/rest-apis/learn/admin/rest-and-learn&quot;&gt;Managing REST Integrations in Learn: The REST Integrations Tool for System Administrators&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/rest-apis/learn/getting-started/basic-authentication&quot;&gt;Basic Authentication with REST&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/rest-apis/learn/getting-started/3lo&quot;&gt;Three-Legged OAuth&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/Kong/mashape-oauth/blob/master/FLOWS.md&quot;&gt;https://github.com/Kong/mashape-oauth/blob/master/FLOWS.md&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/rest-apis/learn/getting-started/tutorials&quot;&gt;REST Tutorials&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://community.blackboard.com/blogs/4/18&quot;&gt;Bookmarklet to help map entitlements to permissions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Mark Kauffman</name></author><category term="blog" /><category term="rest" /><category term="learn" /><category term="api" /><summary type="html">How to Create a User With Limited Entitlements For REST API Calls</summary></entry><entry><title type="html">Caliper Documentation Updated for 1.1</title><link href="/blog/2021/01/05/Caliper-Documentation-Updated-for-1.1.html" rel="alternate" type="text/html" title="Caliper Documentation Updated for 1.1" /><published>2021-01-05T12:59:00+00:00</published><updated>2021-01-05T12:59:00+00:00</updated><id>/blog/2021/01/05/Caliper-Documentation-Updated-for-1.1</id><content type="html" xml:base="/blog/2021/01/05/Caliper-Documentation-Updated-for-1.1.html">&lt;h1 id=&quot;caliper-documentation-updated-for-11&quot;&gt;Caliper Documentation Updated for 1.1&lt;/h1&gt;

&lt;p&gt;We have spent some time over the holiday break updating and organizing our documentation better. One of the longest outstanding changes was to update the Caliper event samples from 1.0 to 1.1.&lt;/p&gt;

&lt;p&gt;I am pleased to announce that we have finally completed this project. The &lt;a href=&quot;/caliper/events/event-guide&quot;&gt;event guide&lt;/a&gt; is largely unchanged, but the individual events have all been updated to show current sample payloads from each event, allowing you to better anticipate the messages you will receive and better plan your storage and reporting requirements.&lt;/p&gt;

&lt;p&gt;Over the next few weeks, we will be highlighting some of the other key updates that we hope will help ease the onboarding process for new developers and make finding exactly what you need when you need it for everyone.&lt;/p&gt;

&lt;p&gt;Happy Coding!&lt;/p&gt;</content><author><name>Scott Hurrey</name></author><category term="blog" /><category term="standards" /><category term="caliper" /><category term="update" /><summary type="html">Caliper Documentation Updated for 1.1</summary></entry><entry><title type="html">SOAP EOL Explained</title><link href="/blog/2020/12/16/SOAP-EOL-Explained.html" rel="alternate" type="text/html" title="SOAP EOL Explained" /><published>2020-12-16T12:00:00+00:00</published><updated>2020-12-16T12:00:00+00:00</updated><id>/blog/2020/12/16/SOAP-EOL-Explained</id><content type="html" xml:base="/blog/2020/12/16/SOAP-EOL-Explained.html">&lt;h1 id=&quot;soap-eol-explained&quot;&gt;SOAP EOL Explained&lt;/h1&gt;

&lt;p&gt;Back in the day, January 4, 2019 to be exact, Blackboard announced deprecation of our SOAP Web Services with this article &lt;a href=&quot;https://blackboard.secure.force.com/publickbarticleview?id=kA039000000Tm3cCAC&amp;amp;homepage=true&quot;&gt;Blackboard SOAP Web Services Deprecation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, almost two years later in our &lt;a href=&quot;https://help.blackboard.com/Learn/Administrator/SaaS/Release_Notes&quot;&gt;Learn SaaS Relase Notes&lt;/a&gt; we’ve written “As of December 31, 2020, Learn SOAP Web Services are no longer supported, as they have reached the end of life per our deprecation policy.” What does this mean for you as a develoepr?&lt;/p&gt;

&lt;p&gt;The most common concern is “Will my SOAP code continue to work in an earlier version of Learn?” or some variation. Here’s a recent example: “Will this be for all versions, or will SOAP API still be available on version 3800?”&lt;/p&gt;

&lt;p&gt;The answer is that client’s self and manged-hosted systems that are on older versions of Learn will not be impacted. If your client is runnign 3800.0.3 and upgrades to the most recent Cumulative Update, the SOAP Webservices should continue to work for them.&lt;/p&gt;

&lt;p&gt;For self and managed-hosted clients that are on 3900.0.0 and are now upgrading using the same build numbers as in SaaS, SOAP will not be supported in any release post Dec 31, 2020.&lt;/p&gt;

&lt;p&gt;Another common quesiton is from those using the Learn LIS 2.0 SIS integration, which is SOAP based. No, we are keeping the LIS 2.0 SIS integration in the product at this time. It will not be affected.&lt;/p&gt;

&lt;p&gt;If you have additional questions, drop a line to developers@anthology.com and we’ll update this blog post with the answer.&lt;/p&gt;

&lt;p&gt;Happy 2021!&lt;/p&gt;</content><author><name>Mark Kauffman</name></author><category term="blog" /><category term="soap" /><category term="learn" /><category term="eol" /><category term="api" /><summary type="html">SOAP EOL Explained</summary></entry><entry><title type="html">Cookies and Browsers</title><link href="/blog/2020/10/15/Cookies-and-Browsers.html" rel="alternate" type="text/html" title="Cookies and Browsers" /><published>2020-10-15T12:00:00+00:00</published><updated>2020-10-15T12:00:00+00:00</updated><id>/blog/2020/10/15/Cookies-and-Browsers</id><content type="html" xml:base="/blog/2020/10/15/Cookies-and-Browsers.html">&lt;h1 id=&quot;cookies-and-browsers&quot;&gt;Cookies and Browsers&lt;/h1&gt;

&lt;p&gt;Most people like cookies. Internet browsers used to like cookies, but a lot has changed in the last few years.&lt;/p&gt;

&lt;p&gt;We are seeing a lot of applications stop working in some browsers because cookies are not being shared, and this post hopes to help explain why that is happening and what can be done about it.&lt;/p&gt;

&lt;p&gt;A web application may set a cookie to track a user’s session. This is very common, however if your web application is going to be hosted in an iframe, then there’s a good chance your cookie won’t be sent back to you. This is because browsers are clamping down on sending “3rd-party” cookies back to applications hosted in an iframe. Note that a 3rd party is a site that is hosted on a domain different than the 1st party, or your web application. The reason is because these cookies can be used for tracking your internet and browsing activity. Safari has disallowed this for years as a user privacy measure.&lt;/p&gt;

&lt;p&gt;Another case where cookies aren’t being sent back is during a form POST back to your application. If you set a cookie, then launch to a 3rd party application, if that application does a form POST back to you, the browser will likely not send your cookie back because it is trying to help prevent cross-site request forgery attacks.&lt;/p&gt;

&lt;p&gt;Rather than detail all the scenarios and work arounds here I link to two web pages that are immensely helpful in explaining the situation and some possible workarounds.&lt;/p&gt;

&lt;p&gt;The TL;DR is if you must set a cookie in your web application, be careful how you configure that cookie’s properties, and understand that at least in Safari, your cookies may not get passed back to you. The other browser makers are going to get as restrictive as Safari soon.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.dev/samesite-cookies-explained/&quot;&gt;Samesite Cookies Explained&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.dev/samesite-cookie-recipes/&quot;&gt;Samesite Cookie Recipes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Eric Preston</name></author><category term="blog" /><category term="lti" /><category term="learn" /><category term="api" /><summary type="html">Cookies and Browsers</summary></entry><entry><title type="html">Student Id Template Variable</title><link href="/blog/2020/10/07/New-Student-Id-Template-Variable.html" rel="alternate" type="text/html" title="Student Id Template Variable" /><published>2020-10-07T08:40:00+00:00</published><updated>2020-10-07T08:40:00+00:00</updated><id>/blog/2020/10/07/New-Student-Id-Template-Variable</id><content type="html" xml:base="/blog/2020/10/07/New-Student-Id-Template-Variable.html">&lt;h1 id=&quot;new-student-id-template-variable&quot;&gt;New! Student Id Template Variable&lt;/h1&gt;

&lt;p&gt;New in SaaS and the forthcoming 3900 release* &lt;a href=&quot;/rest-apis/learn/advanced/dynamic-rendering-with-template-variables&quot;&gt;an @X@user.student_id@X@ template variable!&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Statements regarding our product development initiatives, including new products and future product upgrades, updates or enhancements represent our current intentions, but may be modified, delayed or abandoned without prior notice and there is no assurance that such offering, upgrades, updates or functionality will become available unless and until they have been made generally available to our customers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-markk&lt;/p&gt;</content><author><name>Mark Kauffman</name></author><category term="blog" /><category term="learn" /><category term="template-variables" /><summary type="html">New! Student Id Template Variable</summary></entry><entry><title type="html">Oct 2020 - Changes that will impact Learn B2 Integrations</title><link href="/blog/2020/10/04/Changes-That-Impact-Learn-B2-Integrations.html" rel="alternate" type="text/html" title="Oct 2020 - Changes that will impact Learn B2 Integrations" /><published>2020-10-04T08:40:00+00:00</published><updated>2020-10-04T08:40:00+00:00</updated><id>/blog/2020/10/04/Changes-That-Impact-Learn-B2-Integrations</id><content type="html" xml:base="/blog/2020/10/04/Changes-That-Impact-Learn-B2-Integrations.html">&lt;h1 id=&quot;changes-that-will-impact-b2-integrations&quot;&gt;Changes that will impact B2 Integrations&lt;/h1&gt;

&lt;p&gt;Read &lt;a href=&quot;/archive/b2/resources/preparing-for-saas-and-new-learn-versions&quot;&gt;this article&lt;/a&gt; . Download &lt;a href=&quot;/assets/files/changes-that-will-impact-learn-oct2020.docx&quot;&gt;Oct 2020 - Changes that will impact Learn Integrations.docx&lt;/a&gt; to find out how to get early access for testing.&lt;/p&gt;

&lt;p&gt;-Mark Kauffman&lt;/p&gt;</content><author><name>Mark Kauffman</name></author><category term="blog" /><category term="building-blocks" /><category term="update" /><summary type="html">Changes that will impact B2 Integrations</summary></entry><entry><title type="html">Ally as a Service and UEF Documentation now available</title><link href="/blog/2020/09/03/Ally-as-a-Service-and-UEF-Documentation-now-available.html" rel="alternate" type="text/html" title="Ally as a Service and UEF Documentation now available" /><published>2020-09-03T12:40:00+00:00</published><updated>2020-09-03T12:40:00+00:00</updated><id>/blog/2020/09/03/Ally-as-a-Service-and-UEF-Documentation-now-available</id><content type="html" xml:base="/blog/2020/09/03/Ally-as-a-Service-and-UEF-Documentation-now-available.html">&lt;h1 id=&quot;ally-as-a-service-and-uef-documentation-now-available&quot;&gt;Ally as a Service and UEF Documentation now available&lt;/h1&gt;

&lt;p&gt;Today we launched two new sections of developer documentation - &lt;a href=&quot;/rest-apis/ally/getting-started&quot;&gt;Ally as a Service&lt;/a&gt; (AaaS) and the &lt;a href=&quot;/rest-apis/learn/uef/getting-started&quot;&gt;Learn Ultra Extension Framework&lt;/a&gt; (UEF). These new APIs give you access to integration points and functionality that allows you to bring the power of Blackboard into your applications, and ultimately, your user’s experience.&lt;/p&gt;

&lt;p&gt;Ally as a Service is a standalone, separately licensed API to apply specific components of Ally’s approach to content within your application. In its initial form, you are able to upload files, process them through Ally’s accessibility checklist, and retrieve data that tells you what can be improved. This is only the tip of the iceberg, so make sure you continue to monitor this amazing capability for enhancements moving forward. For more information, including a conversation about pricing, reach out to your Account Executive.&lt;/p&gt;

&lt;p&gt;The Ultra Extension Framework Premium APIs allow an integration to subscribe to events happening real-time in the Ultra UI, and respond to those events by interacting directly with the UI to do things like open panels, display modals, show messages and notifications, and augment the help system in Learn. Partners will need to be at a bronze level or higher to access these Premium APIs. See the partnership team for more information. If you are not a partner, check out &lt;a href=&quot;/partners/become-a-partner&quot;&gt;how to become a partner&lt;/a&gt;. Licensed clients need only request access. Access is granted to your group in the developer portal, much like rate limits. Just open a case on Behind the Blackboard to get started!&lt;/p&gt;

&lt;p&gt;As always, &lt;a href=&quot;/community/contact&quot;&gt;let us know&lt;/a&gt; if you have any questions!&lt;/p&gt;

&lt;p&gt;Happy Coding!&lt;/p&gt;</content><author><name>Scott Hurrey</name></author><category term="blog" /><category term="rest" /><category term="ally" /><category term="learn" /><category term="ultra" /><category term="uef" /><summary type="html">Ally as a Service and UEF Documentation now available</summary></entry></feed>