以下に載せる OAuth の手順は kbsky を用いた一例です。細かい内容については Bluesky の公式ドキュメントを参照してください。
初めに各種エンドポイントを取得するために、メタ情報を取得するエンドポイントにアクセスします。
val auth = AuthFactory
.instance(BSKY_SOCIAL.uri)
.wellKnown()
.oAuthProtectedResource()
auth.wellKnown()
.oAuthAuthorizationServer()
次に、PAR のエンドポイントを呼びます。この時、OAuthContext
を作成して、その中の clientId
と redirectUri
を埋めます。
clientId
には、クライアントの各種メタ情報が入った client-metadata.json
へのフルパスを記述します。
redirectUri
にはそのメタ情報で指定した redirect_uris
のどれかの URI を指定します。client-metadata.json
はこちらなどを参考にしてください。 以下は PAR
リクエストと、そのリクエストから得られた requestUri
から、認証ページの URL を生成するコードです。
val context = OAuthContext().also {
it.clientId = "{{client-metadata.json URL}}"
it.redirectUri = "{{CALLBACK URI}}"
}
auth.oauth()
.pushedAuthorizationRequest(context,
OAuthPushedAuthorizationRequest().also {
it.loginHint = "{{HANDLE}}"
}
)
auth.oauth()
.buildAuthorizationUrl(context,
BuildAuthorizationUrlRequest().also {
it.requestUri = response.data.requestUri
})
println(authorizeUrl)
認証画面にて、認証を終えると、認証コードが付与されたコールバック URL にリダイレクトされます。そのコードを使って、アクセストークンを以下のように取得します。
val callback = "{{CALLBACK URI}}"
val code = Url(callback).parameters["code"].also { println(it) }
auth.oauth()
.tokenRequest(oAuthContext,
OAuthTokenRequest().also {
it.code = code!!
}
)
println(response.data.accessToken)
println(response.data.refreshToken)
アクセストークンを取得した後に、各種リソースにアクセスするために、clientId
、accessToken
、refreshToken
と共に
OAuthContext
から publicKey
と privateKey
を保存してください。
各種リソースの実行には以下のように実行します。この時、認証において足りない情報があり、リトライで解決できる場合は自動的にリトライします。
val oAuthSession = OAuthSession().also {
it.clientId = "{{CLIENT ID}}"
it.publicKey = "{{PUBLIC KEY}}"
it.privateKey = "{{PRIVATE KEY}}"
}
val oAuthProvider = OAuthProvider(
accessTokenJwt = "{{ACCESS TOKEN}}",
session = oAuthSession
)
BlueskyFactory
.instance("{{PDS URL}}")
.feed()
.post(
FeedPostRequest(oAuthProvider).also {
it.text = "TEST"
}
)