Kodexempel

Alla exempel gör samma sak: skickar användaren till Aegis och tar emot resultatet. Byt ut DITT-CLIENT-ID och din callback-adress.

ASP.NET Core

// Program.cs
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = "aegis";
})
.AddCookie()
.AddOpenIdConnect("aegis", options =>
{
    options.Authority = "https://login.aegiscentralid.se/";
    options.ClientId = "DITT-CLIENT-ID";
    options.ClientSecret = builder.Configuration["Aegis:ClientSecret"];
    options.ResponseType = "code";
    options.UsePkce = true;

    options.Scope.Clear();
    options.Scope.Add("openid");
    options.Scope.Add("profile");
    options.Scope.Add("email");
    options.Scope.Add("tenant.role");

    // Samma adress som är registrerad på klienten: https://din-sajt.se/callback
    options.CallbackPath = "/callback";

    // Håll tokens utanför kakan. Med true blir svaret från callbacken större än
    // de 4 kB huvuden många omvända proxyer buffrar, och användaren får 502.
    options.SaveTokens = false;
});

Handlern väljer response_mode=form_post som förval; det fungerar med Aegis, liksom OpenIdConnectResponseMode.Query. Kom ihåg att bocka i tenant.role på klienten om du begär det.

Det här är minimivarianten för en sajt utan annan inloggning. Har sajten redan ASP.NET Core Identity, eller står den bakom en omvänd proxy, finns en genomgång rad för rad i ASP.NET Core steg för steg.

Läs anspråken som vanligt:

var epost = User.FindFirst(ClaimTypes.Email)?.Value;
var roll  = User.FindFirst("tenant_role")?.Value;

Node

// npm i openid-client
import * as client from "openid-client";

const config = await client.discovery(
    new URL("https://login.aegiscentralid.se/"),
    "DITT-CLIENT-ID",
    process.env.AEGIS_CLIENT_SECRET);

// Skicka användaren till Aegis
const verifier = client.randomPKCECodeVerifier();
const challenge = await client.calculatePKCECodeChallenge(verifier);
req.session.verifier = verifier;   // behövs vid återkomsten

const url = client.buildAuthorizationUrl(config, {
    redirect_uri: "https://din-sajt.se/callback",
    scope: "openid profile email tenant.role",
    code_challenge: challenge,
    code_challenge_method: "S256"
});
res.redirect(url.href);

// Ta emot svaret
const tokens = await client.authorizationCodeGrant(
    config,
    new URL(req.url, "https://din-sajt.se"),
    { pkceCodeVerifier: req.session.verifier });

const claims = tokens.claims();

PHP

<?php
// composer require jumbojett/openid-connect-php
use Jumbojett\OpenIDConnectClient;

$oidc = new OpenIDConnectClient(
    'https://login.aegiscentralid.se/',
    'DITT-CLIENT-ID',
    getenv('AEGIS_CLIENT_SECRET'));

$oidc->setRedirectURL('https://din-sajt.se/callback.php');
$oidc->addScope(['openid', 'profile', 'email', 'tenant.role']);
$oidc->setCodeChallengeMethod('S256');

$oidc->authenticate();

$namn  = $oidc->requestUserInfo('name');
$epost = $oidc->requestUserInfo('email');
$roll  = $oidc->getVerifiedClaims('tenant_role');

Python

# pip install authlib flask
from authlib.integrations.flask_client import OAuth

oauth = OAuth(app)
oauth.register(
    name="aegis",
    server_metadata_url="https://login.aegiscentralid.se/.well-known/openid-configuration",
    client_id="DITT-CLIENT-ID",
    client_secret=os.environ["AEGIS_CLIENT_SECRET"],
    client_kwargs={
        "scope": "openid profile email tenant.role",
        "code_challenge_method": "S256",
    })

@app.route("/login")
def login():
    return oauth.aegis.authorize_redirect("https://din-sajt.se/callback")

@app.route("/callback")
def callback():
    token = oauth.aegis.authorize_access_token()
    anvandare = token["userinfo"]
    return f"Inloggad som {anvandare['email']} ({anvandare['tenant_role']})"

Ren HTML, utan backend

<script src="https://login.aegiscentralid.se/embed.js"
        data-client-id="DITT-CLIENT-ID"
        data-redirect="https://din-sajt.se/callback"
        data-scope="openid profile email"></script>

<div class="aegis-signin"></div>

På callback-sidan:

<script src="https://login.aegiscentralid.se/embed.js"
        data-client-id="DITT-CLIENT-ID"
        data-redirect="https://din-sajt.se/callback"></script>
<script>
Aegis.completeLogin()
    .then(function (tokens) {
        // tokens.id_token, tokens.access_token
    })
    .catch(function (fel) {
        console.error(fel.message);
    });
</script>

Har du en server, låt den göra utbytet. Tokens som hamnar i webbläsaren kan läsas av varje skript på sidan. Det här alternativet finns för sajter som saknar backend helt.

Någon annan stack

Aegis följer OpenID Connect Discovery, så vilket certifierat bibliotek som helst fungerar. Tre saker gäller alltid:

  • Peka biblioteket på upptäcktsdokumentet.
  • Be om response_type=code. Implicit flow finns inte hos oss.
  • Slå på PKCE med S256. Metoden plain godtas inte.