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");

    options.CallbackPath = "/callback";
    options.SaveTokens = true;
});

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.