🙂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