Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions id.jsonld
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"client_id": "http://localhost:8080/id.jsonld",
"redirect_uris": [
"http://localhost:8080/callback.html"
],
"scope": "openid webid",
"grant_types": [
"authorization_code",
"refresh_token"
],
"response_types": [
"code"
],
"@context": "https://www.w3.org/ns/solid/oidc-context.jsonld"
}
4 changes: 2 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
}
</script>
<script type="module">
import { DPoPTokenProvider, ReactiveFetchManager } from "./dist/mod.js"
import { DPoPTokenProvider, clientIdClientCallback, ReactiveFetchManager } from "./dist/mod.js"
import "./dist/registerElements.js"

/* Page functionality: Buttons */
Expand Down Expand Up @@ -63,7 +63,7 @@
const issuerUi = document.querySelector("idp-picker")
const callbackUri = new URL("/callback.html", location.href).toString()

const dPoPTokenProvider = new DPoPTokenProvider(callbackUri, ui.getCode.bind(ui), issuerUi.getIssuer.bind(issuerUi))
const dPoPTokenProvider = new DPoPTokenProvider(callbackUri, ui.getCode.bind(ui), issuerUi.getIssuer.bind(issuerUi), clientIdClientCallback(new URL("./id.jsonld", location.href)))

new ReactiveFetchManager([dPoPTokenProvider]).registerGlobally()
</script>
Expand Down
8 changes: 5 additions & 3 deletions src/DPoPTokenProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,19 @@ import * as DPoP from "dpop"
import type { GetCodeCallback } from "./GetCodeCallback.js"
import type { TokenProvider } from "./TokenProvider.js"
import type { GetIssuerCallback } from "./GetIssuerCallback.js"
import type { GetClientCallback } from "./GetClientCallback.js"

export class DPoPTokenProvider implements TokenProvider {
readonly #getCode: GetCodeCallback
readonly #callbackUri: string
readonly #getIssuer: GetIssuerCallback
readonly #getClient: GetClientCallback

constructor(callbackUri: string, getCodeCallback: GetCodeCallback, getIssuerCallback: GetIssuerCallback) {
constructor(callbackUri: string, getCodeCallback: GetCodeCallback, getIssuerCallback: GetIssuerCallback, getClientCallback: GetClientCallback) {
this.#getCode = getCodeCallback
this.#callbackUri = callbackUri
this.#getIssuer = getIssuerCallback
this.#getClient = getClientCallback
}

async matches(request: Request): Promise<boolean> {
Expand All @@ -25,8 +28,7 @@ export class DPoPTokenProvider implements TokenProvider {
const discoveryResponse = await oauth.discoveryRequest(issuer, {signal: request.signal})
const authorizationServer = await oauth.processDiscoveryResponse(issuer, discoveryResponse)

const registrationResponse = await oauth.dynamicClientRegistrationRequest(authorizationServer, {redirect_uris: [this.#callbackUri]}, {signal: request.signal})
const clientRegistration = await oauth.processDynamicClientRegistrationResponse(registrationResponse)
const clientRegistration = await this.#getClient(authorizationServer, this.#callbackUri, request.signal)
const [registeredRedirectUri] = clientRegistration.redirect_uris as string[]
const [registeredResponseType] = clientRegistration.response_types as string[]

Expand Down
3 changes: 3 additions & 0 deletions src/GetClientCallback.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import * as oauth from "oauth4webapi"

export type GetClientCallback = (as: oauth.AuthorizationServer, redirectUri: string, signal: AbortSignal) => Promise<oauth.Client>
7 changes: 7 additions & 0 deletions src/clientIdClientCallback.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import type {GetClientCallback} from "./GetClientCallback.js"

export function clientIdClientCallback(clientIdDocUri: URL): GetClientCallback {
return async function (_, __, signal) {
return await (await fetch(clientIdDocUri, {signal})).json()
}
}
6 changes: 6 additions & 0 deletions src/dynamicRegistrationClientCallback.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import * as oauth from "oauth4webapi"

export async function dynamicRegistrationClientCallback(as: oauth.AuthorizationServer, redirectUri: string, signal: AbortSignal): Promise<oauth.Client> {
const registrationResponse = await oauth.dynamicClientRegistrationRequest(as, {redirect_uris: [redirectUri]}, {signal})
return await oauth.processDynamicClientRegistrationResponse(registrationResponse)
}
3 changes: 3 additions & 0 deletions src/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@ export * from "./TokenProvider.js"
export * from "./GetIssuerCallback.js"
export * from "./IdpPicker.js"
export * from "./IssuerRequestCancelledError.js"
export * from "./GetClientCallback.js"
export * from "./dynamicRegistrationClientCallback.js"
export * from "./clientIdClientCallback.js"
2 changes: 1 addition & 1 deletion src/reactive-fetch-worker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ async function onFetch(e: FetchEvent): Promise<void> {
}

function upgrade(request: Request, client: Client): Promise<Response> {
const dPoPTokenProvider = new DPoPTokenProvider(undefined!, postEventAndWait.bind(undefined, client), undefined!) // TODO: Callback, getIssuer
const dPoPTokenProvider = new DPoPTokenProvider(undefined!, postEventAndWait.bind(undefined, client), undefined!, undefined!) // TODO: Callback, getIssuer, getClient
const bearerProvider = new BearerTokenProvider(postEventAndWait.bind(undefined, client))

return new ReactiveAuthenticationClient(self.fetch, [bearerProvider, dPoPTokenProvider]).fetch(request)
Expand Down