DOBON.NETプログラミング道掲示板
HOME
HELP
新規作成
新着記事
ツリー表示
スレッド表示
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
■35422
/ 親階層)
ワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る
□投稿者/ けい
一般人(8回)-(2023/05/12(Fri) 19:05:52)
環境/言語:[Windows10、VB.NET2022]
分類:[.NET]
お世話になります。
ヤフーのアカウントで、
開発用のテストアカウントを設け、
ヤフーのWebAPIを使用するのに必要な、
「クライアントID」を割り振ってもらっています。
また、認証を求めるWebAPIを使用するのに必要な、
アクセストークンという認証文字列を受け取るためのURLである、
「コールバックURL」を指定しています。
ヤフーのアクセストークンを取得するためのアクセス先が、
「Authorizationエンドポイント」と言い、接続先は、
URL: https://auth.login.yahoo.co.jp/yconnect/v2/authorization
サポートするHTTPメソッド: GET/POST
です。
(参照)
Authorizationエンドポイント
https://developer.yahoo.co.jp/yconnect/v2/authorization_code/authorization.html
プログラムにおいては、
Form1上のButton1をクリックすると、
このURLに接続し、自動ログインがなされ、
アクセストークン情報を含むJSONデータが返り、
RichTextBox1に表示するようにしたいです。
そこで、次のようなコードを記述しました。
---------------------------------------------
Imports System.IO
Imports System.Text
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs)
Handles Button1.Click
Dim TargetURL As String
TargetURL="https://auth.login.yahoo.co.jp/yconnect/v2/authorization?client_id=<クライアントID>&response_type=token(or code)&scope=openid&redirect_uri=<コールバックURL>&output=json"
Using client As New System.Net.Http.HttpClient()
Using response1 As System.Net.Http.HttpResponseMessage = client.GetAsync(TargetURL).Result
Dim responseBody1 As String = response1.Content.ReadAsStringAsync().Result
RichTextBox1.Text = responseBody1.ToString
End Using
End Using
End Sub
End Class
---------------------------------------------
これを実行しますと、
RichTextBox1には、JSONデータではなく、
ヤフーのログイン画面のHTMLが返ります。
自動ログインができていません。
ここで、TargetURLも文字列を、ブラウザのURL欄に手動で入れて実行すると、
ヤフーのログイン画面が表示されます。
ヤフーのログインでは、パスワードが固定ではなく、
ユーザーIDを入力したら、ワンタムパスワードを発行し、
メールまたはスマホのSMSに届いたパスワードを画面に手入力して、
ログインします。
そうすると、指定していた「コールバックURL」のサイトがリダイレクト表示され、URL欄に、「#access_token=」とアクセストークンが表示されます。
この一連の手続きを手動ではなく自動で行いたいので、
次のようなコードを検討しました。
「TargetURL=」の後ろの部分です。
ワンタイムパスワード認証は、Basic認証ではないのかもしれませんが、
まずは書いてみました。
(参照)
https://teratail.com/questions/373083
---------------------------------------------
'Basic認証するユーザ名とパスワード
Dim userName = "<ユーザーID>"
Dim userPassword = ""
'リクエストの生成
Dim request = New HttpRequestMessage
request.Method = HttpMethod.Post
request.RequestUri = New Uri(TargetURL)
'Basic認証ヘッダを付与する
request.Headers.Authorization
=
New System.Net.Http.Headers.AuthenticationHeaderValue
("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes
(String.Format("{0}:{1}", userName, userPassword))))
'リクエストの送信
Dim httpClient = New HttpClient()
Dim response2 = httpClient.SendAsync(request)
RichTextBox2.Text = response2.ToString
---------------------------------------------
これを実行しますと、
RichTextBox2には、
次のような文字列が返ります。
System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[System.Net.Http.HttpResponseMessage,System.Net.Http.HttpClient+<<SendAsync>g__Core|83_0>d]
上記のコードでは、
userPassword = ""
のため、当然ログインができないのだと思いますが、
ワンタイムパスワードをここでどのように記述すればよいのか、
わかりませんでした。
また、PostAsyncを使用する気もすればよい気もするのですが、
ここでの使い方が分かりませんでした。
(参照)
HttpClient.PostAsync メソッド
https://learn.microsoft.com/ja-jp/dotnet/api/system.net.http.httpclient.postasync?view=net-8.0
WebRequestでPOSTする方法はネットに例があったのですが、
廃止されているとのことでした。
(参照)
認証が必要なページをダウンロードする
http://dobon.net/vb/dotnet/internet/usecredentials.html
WebRequest、WebClient、ServicePoint は廃止されている
https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/networking/6.0/webrequest-deprecated
以上、長くなってしまいましたが、
ワンタイムパスワードを使用するサイトに自動ログインしてアクセストークンを含むJSONデータを取得するには、どのようにしたらよいか。
可能な範囲でご指導いただきたく、どうぞよろしくお願い申し上げます。
マルチポストを報告
Javascriptを有効にしてください
この投稿がマルチポスト(全く同じ内容の投稿が別の掲示板に投稿されている)の場合は、以下のフォームをご利用いただくと、報告の投稿が簡単に行えます。
このフォームに必要事項を入力後、「返信フォームに入力する」ボタンをクリックすると、このページの下にある
返信フォーム
の項目が自動的に埋まります。実際に投稿するには、その後、返信フォームの「送信」ボタンをクリックしてください。
このフォームを利用しても返信フォームが埋まるだけですので、後で書き直してから投稿することもできます。
「マルチポストされている場所」には、マルチポストされている場所のURLを入力してください。複数のURLを改行区切りで入力することができます。
マルチポストされている場所
オプション
マルチポスト先の投稿が、別人によるいたずらである可能性が高い
違反を報告
Javascriptを有効にしてください
この投稿が掲示板のルールに違反しており、何らかの対処が必要であると思われる場合は、以下のフォームを利用して管理人に報告することができます。
マルチポストの報告は、返信フォームの上にある「マルチポストの報告」リンクをご利用ください。
この機能の悪用は絶対にしないでください。
悪用されたと管理人が判断した場合は、予告なしで厳しい対処がなされる可能性があります。
確認等の目的で、入力されたメールアドレス宛に返信メールが送信される可能性があります。メールの受信ができないメールアドレスは入力しないでください。
下のフォームが使用できない場合は、
メールフォーム
を使って管理人にご報告ください。
お名前(必須)
メールアドレス(必須)
本文(必須)
(違反理由など)
削除キー/
編集
削除
前の記事
(元になった記事)
次の記事
(この記事の返信)
親記事
→Re[1]: ワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る
/Azulean
上記関連ツリー
ワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る
/ けい
(23/05/12(Fri) 19:05)
#35422
←Now
└
Re[1]: ワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る
/ Azulean
(23/05/12(Fri) 21:47)
#35423
└
Re[2]: ワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る
/ けい
(23/05/12(Fri) 22:31)
#35424
└
Re[3]: ワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る
/ けい
(23/05/16(Tue) 17:20)
#35425
解決
済
み!
上記ツリーを一括表示
/
上記ツリーをトピック表示
上記の記事へ返信
入力内容にタグは利用できません。
引用部分(行頭に「>」や「■」が付いている部分)が全体の 80% 以上のコメントは投稿できません。
半角カナは使用しないでください。文字化けの原因になります。
削除キーを覚えておくと、自分の記事の編集・削除ができます。
記事中に No*** のように書くとその記事にリンクされます(No は半角英字/*** は半角数字)。
使用例)
No123 → 記事No123の記事リンクになります(指定表示)。
No123,130,134 → 記事No123/130/134 の記事リンクになります(複数表示)。
No123-130 → 記事No123〜130 の記事リンクになります(連続表示)。
投稿前に必ずお読みください
初めて投稿される方は、必ず「
書き込みのルールについて(12/4/2更新)
」をお読みください。
読むのが面倒、ルールを守りたくないという方は、「
お気楽掲示板
」へ投稿してください。
質問を投稿する場合は、「
質問をする際のアドバイス
」を参考にしてください。
投稿は、明記のない限り、パブリックドメインになります。
マルチポストされた投稿を報告する時は匿名で投稿し、マルチポストされている場所を併記してください。以下のリンクをクリックしていただくと、自動で下のフォームが埋まりますので、その後「送信」ボタンを押してご投稿ください。
マルチポストの報告をする
マルチポストの報告をするが、マルチポスト先の投稿が嫌がらせである(元の投稿者とは別人が行なっている)可能性が高い
(投稿日時に開きがあり、こちらの投稿の方が早い場合は、その可能性が高いです)
Name
/
E-Mail
/
Title
/
URL
/
Comment/ 通常モード->
図表モード->
(適当に改行して下さい/半角10000文字以内)
■No35422に返信(けいさんの記事) > お世話になります。 > > ヤフーのアカウントで、 > 開発用のテストアカウントを設け、 > ヤフーのWebAPIを使用するのに必要な、 > 「クライアントID」を割り振ってもらっています。 > > また、認証を求めるWebAPIを使用するのに必要な、 > アクセストークンという認証文字列を受け取るためのURLである、 > 「コールバックURL」を指定しています。 > > ヤフーのアクセストークンを取得するためのアクセス先が、 > 「Authorizationエンドポイント」と言い、接続先は、 > URL: https://auth.login.yahoo.co.jp/yconnect/v2/authorization > サポートするHTTPメソッド: GET/POST > です。 > > (参照) > Authorizationエンドポイント > https://developer.yahoo.co.jp/yconnect/v2/authorization_code/authorization.html > > プログラムにおいては、 > Form1上のButton1をクリックすると、 > このURLに接続し、自動ログインがなされ、 > アクセストークン情報を含むJSONデータが返り、 > RichTextBox1に表示するようにしたいです。 > > そこで、次のようなコードを記述しました。 > > --------------------------------------------- > > Imports System.IO > Imports System.Text > > Public Class Form1 > > Private Sub Button1_Click(sender As Object, e As EventArgs) > Handles Button1.Click > > Dim TargetURL As String > > TargetURL="https://auth.login.yahoo.co.jp/yconnect/v2/authorization?client_id=<クライアントID>&response_type=token(or code)&scope=openid&redirect_uri=<コールバックURL>&output=json" > > Using client As New System.Net.Http.HttpClient() > Using response1 As System.Net.Http.HttpResponseMessage = client.GetAsync(TargetURL).Result > > Dim responseBody1 As String = response1.Content.ReadAsStringAsync().Result > RichTextBox1.Text = responseBody1.ToString > > End Using > End Using > > End Sub > > End Class > > --------------------------------------------- > > これを実行しますと、 > RichTextBox1には、JSONデータではなく、 > ヤフーのログイン画面のHTMLが返ります。 > 自動ログインができていません。 > > ここで、TargetURLも文字列を、ブラウザのURL欄に手動で入れて実行すると、 > ヤフーのログイン画面が表示されます。 > ヤフーのログインでは、パスワードが固定ではなく、 > ユーザーIDを入力したら、ワンタムパスワードを発行し、 > メールまたはスマホのSMSに届いたパスワードを画面に手入力して、 > ログインします。 > そうすると、指定していた「コールバックURL」のサイトがリダイレクト表示され、URL欄に、「#access_token=」とアクセストークンが表示されます。 > > この一連の手続きを手動ではなく自動で行いたいので、 > 次のようなコードを検討しました。 > > 「TargetURL=」の後ろの部分です。 > > ワンタイムパスワード認証は、Basic認証ではないのかもしれませんが、 > まずは書いてみました。 > > (参照) > https://teratail.com/questions/373083 > --------------------------------------------- > > 'Basic認証するユーザ名とパスワード > Dim userName = "<ユーザーID>" > Dim userPassword = "" > > 'リクエストの生成 > Dim request = New HttpRequestMessage > request.Method = HttpMethod.Post > request.RequestUri = New Uri(TargetURL) > > 'Basic認証ヘッダを付与する > request.Headers.Authorization > = > New System.Net.Http.Headers.AuthenticationHeaderValue > ("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes > (String.Format("{0}:{1}", userName, userPassword)))) > > 'リクエストの送信 > Dim httpClient = New HttpClient() > Dim response2 = httpClient.SendAsync(request) > RichTextBox2.Text = response2.ToString > > --------------------------------------------- > > これを実行しますと、 > RichTextBox2には、 > 次のような文字列が返ります。 > > System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[System.Net.Http.HttpResponseMessage,System.Net.Http.HttpClient+<<SendAsync>g__Core|83_0>d] > > 上記のコードでは、 > userPassword = "" > のため、当然ログインができないのだと思いますが、 > ワンタイムパスワードをここでどのように記述すればよいのか、 > わかりませんでした。 > > また、PostAsyncを使用する気もすればよい気もするのですが、 > ここでの使い方が分かりませんでした。 > > (参照) > HttpClient.PostAsync メソッド > https://learn.microsoft.com/ja-jp/dotnet/api/system.net.http.httpclient.postasync?view=net-8.0 > > WebRequestでPOSTする方法はネットに例があったのですが、 > 廃止されているとのことでした。 > > (参照) > 認証が必要なページをダウンロードする > http://dobon.net/vb/dotnet/internet/usecredentials.html > WebRequest、WebClient、ServicePoint は廃止されている > https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/networking/6.0/webrequest-deprecated > > 以上、長くなってしまいましたが、 > ワンタイムパスワードを使用するサイトに自動ログインしてアクセストークンを含むJSONデータを取得するには、どのようにしたらよいか。 > > 可能な範囲でご指導いただきたく、どうぞよろしくお願い申し上げます。 > >
File
/
アップ可能拡張子=> /
.gif
/
.jpg
/
.png
/.zip
1) 太字の拡張子は画像として認識されます。
2) 画像は初期状態で縮小サイズ250×250ピクセル以下で表示されます。
3) 同名ファイルがある、またはファイル名が不適切な場合、
ファイル名が自動変更されます。
4) アップ可能ファイルサイズは1回
20KB
(1KB=1024Bytes)までです。
5) ファイルアップ時はプレビューは利用できません。
6) スレッド内の合計ファイルサイズ:[0/300KB]
残り:[300KB]
Icon
/
ホイールロボ
くるりロボ
ぱんだ
ふとめネコ
ねずみ
こあら
疑問ねこ
ランダム
管理者用
(画像を選択/
サンプル一覧
)
削除キー
/
(半角8文字以内)
解決
済
み!
BOX/
解決したらチェックしてください!(スレッドを閉じる目的ではチェックしないでください!)
クリエイティブ・コモンズ・ライセンス
を Comment の末尾に挿入するには、以下のリンクをクリックしてください。(Javascript で挿入しているだけです。)
表示(CC BY)
|
表示-改変禁止(CC BY-ND)
|
表示-継承(CC BY-SA)
|
表示-非営利(CC BY-NC)
|
表示-非営利-改変禁止(CC BY-NC-ND)
|
表示-非営利-継承(CC BY-NC-SA)
プレビュー/
クッキーに保存しない/
Mode/
通常管理
表示許可
Pass/
HOME
HELP
新規作成
新着記事
ツリー表示
スレッド表示
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
-
Child Tree
-