🙂Rust言語でGUIを作成する環境Tauriを使ってOpen ID Connect認証を行うプログラムを書きたいと思っています。Rust言語でOpen ID Connectを行う処理のサンプルを作成してください。

💻

Open ID ConnectはOAuth 2.0をベースにした認証プロトコルであり、Webアプリケーションやモバイルアプリケーションなどのクライアントアプリケーションが、認証プロバイダーからユーザーの認証情報を取得するために使用されます。

RustでOpen ID Connect認証を行うには、OpenID Connectクライアントライブラリを使用することが一般的です。以下は、RustのOpenID Connectクライアントライブラリである「openidconnect-rs」を使用してOpen ID Connect認証を行う方法のサンプルコードです。

use openidconnect::{IssuerUrl, ClientId, ClientSecret, RedirectUrl};
use openidconnect::core::{
    CoreClient, CoreIdTokenClaims, CoreProviderMetadata, CoreResponseType,
    CoreAuthorizationCode, CoreAuthDisplay, CoreAuthPrompt, CoreNonce,
};
use url::Url;

// Open ID Connect認証に必要な情報を設定する
let issuer_url = IssuerUrl::new("<https://accounts.google.com>".to_string()).unwrap();
let client_id = ClientId::new("your-client-id".to_string());
let client_secret = ClientSecret::new("your-client-secret".to_string());
let redirect_url = RedirectUrl::new("<http://localhost:8000/redirect>".to_string()).unwrap();
let client = CoreClient::discover(
    issuer_url,
    client_id,
    Some(client_secret),
    &Default::default(),
).unwrap();

// 認証エンドポイントにリクエストを送信するためのURLを生成する
let (auth_url, csrf_state, nonce) = client.authorize_url(
    CoreResponseType::Code,
    CoreAuthDisplay::Page,
    CoreAuthPrompt::None,
    Some(&redirect_url),
    None::<&CoreNonce>,
);

// 認証エンドポイントにリダイレクトする
println!("Redirect to: {}", auth_url.to_string());

// 認証エンドポイントからのリダイレクトURIを受け取る
let redirect_uri: Url = /* リダイレクトURIを取得する */;
let code = CoreAuthorizationCode::new(
    redirect_uri.query_pairs()
        .find(|(ref key, _)| key == "code")
        .map(|(_, val)| val.to_owned())
        .expect("missing authorization code"),
);

// トークンエンドポイントにリクエストを送信して、アクセストークンを取得する
let token_response = client
    .exchange_code(code)
    .unwrap()
    .request_async(Default::default())
    .await
    .unwrap();

// アクセストークンからIDトークンを取得する
let id_token = token_response.id_token().unwrap().clone();
let id_token_claims = id_token.claims(&client.id_token_verifier(), &nonce).unwrap().clone() as CoreIdTokenClaims<CoreProviderMetadata>;

// IDトークンからユーザー情報を取得する
let user_id = id_token_claims.subject().to_string();
let email = id_token_claims.email