92223


提示コードの`///`コメント部内部ですが`Process.Start`を起動して得られるコードをブラウザを起動する方法ではくプログラム上でそのコードを取得したいのですが実装方法がわかりません。  
ブラウザを起動させると表示されるURLのcode=部のコードを取得したい。

[code]

    https://mstdn.jp/oauth/authorize/native?code=XXXXXXXXXXXXXXXXXXXX
    
[/code]

##### 試したこと

取りえず`Process.Start()`でコードを取得  
`client.PostAsync`で取得で取得を試しましたが何を取得されませんでした。  
※jsonとクエリは別物ですが一応調べたことなので書きました。  
一回取得したコードを変数に張り付けて使いまわしを試しましたがエラーになりました。

##### 参考サイト

リファレンス(<https://mastodon.example> /oauth/authorize 部):
<https://docs.joinmastodon.org/methods/apps/oauth/>

調べたサイト  
A <https://learn.microsoft.com/ja-
jp/dotnet/api/system.net.httpwebrequest?view=net-7.0>

B
<https://arkgame.com/2016/09/04/c%E3%81%A7url%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/>

[code]

       /*##################################################################################################################
             * コンストラクタ
            ###################################################################################################################*/
            public Client(string client_id,string url)
            {
                instance = url;
                client = new HttpClient();
                client.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("test/1.0"));
    
                Process.Start("explorer.exe", $"\"https://{instance}/oauth/authorize?client_id={client_id}&scope=read&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code\"");
                Console.Write("Input code: ");
    
                auth_code = Console.ReadLine();
                
            }
    
    
[/code]


CC BY-SA 4.0
2022-11-14T04:12:44.013
92214
2022-11-15T12:41:06.250
2022-11-14T09:28:01.860
55177
55177
question
c#
C# 言語でクエリ パラメータを取得する方法が知りたい


それ以前にMastodonが採用しているOAuth 2.0の認可フローを理解してください。

  * [OAuth 2.0 全フローの図解と動画](https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f)

から認可コードフローの図を引用します。

[![画像の説明をここに入力](https://i.stack.imgur.com/aYQu9.png)](https://i.stack.imgur.com/aYQu9.png)

`Process.Start()`で起動したブラウザーは図の２～５の流れに対応し、`Console.ReadLine()`で受け取るのはブラウザーに表示された「認可コード」で図の６に対応します。  
ついでに`/oauth/token`にアクセスしている部分が図の７～８です。

* * *

> プログラム上でそのコードを取得したい

サービス（この場合Mastodon）にログイン済みのWebブラウザーを使用すれば３～５が省略されるため、コードを直接取得したい・できるかもしれないと思われるかもしれませんが、他のブラウザーを使用すれば結局はこの手順が実施され、利用者にログインが求められます。

プログラムで取得するためにはWebサービス化し `redirect_uri`
にWebサービスのアドレスを指定することで、受け取れます。Webサービス化せずコマンドラインで実行している限りはこの手順が必要です。（プログラムの条件によっては別の手順でも動作するかもしれませんが、その辺りの背景はわからないので一般的な手順しか案内できません。）

* * *

> 起動毎にやるしかないのでしょうか？

図から明らかですが、８のアクセストークンを保存すればいいかと。念のため、６の認可コードは「短命」とあるから保存に向きません。


CC BY-SA 4.0
2022-11-14T09:57:50.240
92223
2022-11-15T12:41:06.250
2022-11-15T12:41:06.250
4236
4236
92214
answer